Оптимизация запросов... Таблицы по 30k записей...

GrayMaster

Новичок
Оптимизация запросов... Таблицы по 30k записей...

Добрый день ! Подскажите как можно оптимизировать скрип встравляющий в таблицу только уникальные значения (уникальные домены) из другой таблицы.

Сейчас я это делаю так:

PHP:
$query = $mysql->query("SELECT * FROM `".$config['db']['prefix']."_base_temp` WHERE `id` <= '".$id."'");
while ($fetch = $mysql->fetch_array($query)) {
        $domain = get_domain($fetch['url']);

        $exists_query = $mysql->query("SELECT count(*) FROM `".$config['db']['prefix']."_base` WHERE `url` LIKE '%".$domain."%'");

        if ($mysql->result($exists_query, 0) == 0) {
                $mysql->query("INSERT INTO `".$config['db']['prefix']."_base` SET `url`='".addslashes($fetch['url'])."'");
        }
}
В таблицах обычно более 30.000 рядов - занимает очень много времени :(
$mysql - класс для работы с MySQL

Вопрос 2: больше времени будет занимать INSERT, если поле "URL" будет иметь стату UNIQUE ?
 

GrayMaster

Новичок
Забыл... get_domain() - возвращает домен от URL'а.
И после всего этого делаю:
PHP:
$mysql->query("DELETE FROM `".$config['db']['prefix']."_base_temp` WHERE `id` <= '".$id."'");
$id - получаю перед началом работы. Т.к. во время переноса записей, в таблицу base_temp добавляются новые записи...
 

Tor

Новичок
WHERE `url` LIKE '%".$domain."%'
такие запорсы не могут быть быстрыми по определению

судя по следующему запросу, этот должен заканчиваться на

WHERE `url`='".addslashes($fetch['url'])."'"
 

GrayMaster

Новичок
Понимаю... Но такой варниант к сожаления не подходит :(
Сделал индеку UNIQUE на "url" - хоть какая то оптимизация...
 

SiMM

Новичок
GrayMaster, ты бы вначале доку-то бы поискал, а уж оттуда бы понял, чем оно может тебе помочь. Хотя оно конечно, да, куда приятней, когда тебе всё разжуют и в рот положат.
http://dev.mysql.com/doc/mysql/ru/EXPLAIN.html
 

nina

Новичок
Re: Оптимизация запросов... Таблицы по 30k записей...

Есть такая вещь как INSERT INTO SELECT - все что ты хочешь одним запросом делается по идее. Чтобы уникальные поля выбрать используй SELECT DISTINCT.

explain поможет увидеть сколько строк таблицы просмотрено при выполнении запроса, какие индексы использованы и т.п.

Когда пишешь LIKE '%bla-bla%' индекс по полю не используется, а когда LIKE 'bla-bla%' - используется
 
Сверху