SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.04.2010 11:07:24

AlexGinSQLinfo
Участник
Зарегистрирован: 23.04.2010
Сообщений: 5

При выборке виснет машина - нужна помощь в оптимизации запроса

Проблема заключается в следующем:

Запрос:

SELECT * FROM table_links WHERE (search_id IN (SELECT MAX(search_id) FROM table_links GROUP by site_link)) AND (cat_descr like '%mobile%') AND (product_name like 'nokia%');";

Пояснения:

table_links - таблица, в который на данный момент 120000+ записей, но будет в разы больше
таблица содержит информацию о товарах с разных сайтов
Данные будут добавляться, и для того чтобы не было одинаковых товаров с одного сайта, было создано поле search_id (int(12))

cat_descr - название категории товаров (char(255))
product_name - название товара (char(255))
site_link - адрес сайта (char(90))

Нужно получить товары по каждому сайту с максимальным search_id для указанной категории и имени товара. Часть запроса для поиска max search_id работает без проблем (ниже пример).

mysql> SELECT MAX(search_id) FROM table_links GROUP by site_link;
+----------------+
| MAX(search_id) |
+----------------+
|            385 |
|            379 |
|            384 |
+----------------+
3 rows in set (0.00 sec)

Запрос указанный в самом начале на данный момент занимает 2 мин 45 сек; а если убрать AND (cat_descr like '%mobile%') AND (product_name like 'nokia%');"; и оствить соответственно

SELECT * FROM table_links WHERE (search_id IN (SELECT MAX(search_id) FROM table_links GROUP by site_link))

то всё обстои ещё печальнее - всё зависает - ждал минут 20, но потом все равно перегружал машину.

Стоит отметить, что для search_id, site_link, product_name, cat_desct были добавлены индексы.

===

Подскажите пожалуйста как можно оптимизировать этот зарос?

Неактивен

 

#2 23.04.2010 11:25:34

AlexGinSQLinfo
Участник
Зарегистрирован: 23.04.2010
Сообщений: 5

Re: При выборке виснет машина - нужна помощь в оптимизации запроса

Не обращайте внимания на "; в конце запроса - из кода копировал

Полный запрос

SELECT * FROM table_links WHERE (search_id IN (SELECT MAX(search_id) FROM table_links GROUP by site_link)) AND (cat_descr like '%mobile%') AND (product_name like 'nokia%');

Неактивен

 

#3 23.04.2010 13:39:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: При выборке виснет машина - нужна помощь в оптимизации запроса

В пятой версии неправильно работают подзапросы вида IN (SELECT .. GROUP BY) они выполняются для каждой строки основного запроса.

Попробуйте переписать ваш запрос через JOIN:

SELECT t1.* FROM table_links t1 JOIN (SELECT MAX(search_id) FROM table_links GROUP by site_link) t2 USING(search_id) WHERE (t1.cat_descr like '%mobile%') AND (t1.product_name like 'nokia%');

Неактивен

 

#4 25.04.2010 01:58:55

AlexGinSQLinfo
Участник
Зарегистрирован: 23.04.2010
Сообщений: 5

Re: При выборке виснет машина - нужна помощь в оптимизации запроса

Пока ещё не работает запрос, выдаёт

ERROR 1054 (42S22): Unknown column 'search_id' in 'from clause'

Но за своет по поводу IN / JOIN огромное спасибо

Неактивен

 

#5 25.04.2010 02:16:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: При выборке виснет машина - нужна помощь в оптимизации запроса

Забыл MAX(search_id) переименовать в search_id. Так должно работать:

SELECT t1.* FROM table_links t1 JOIN (SELECT MAX(search_id) as search_id FROM table_links GROUP by site_link) t2 USING(search_id) WHERE (t1.cat_descr like '%mobile%') AND (t1.product_name like 'nokia%');

Неактивен

 

#6 25.04.2010 02:32:29

AlexGinSQLinfo
Участник
Зарегистрирован: 23.04.2010
Сообщений: 5

Re: При выборке виснет машина - нужна помощь в оптимизации запроса

Vasya, огромнейшее спасибо! Заработало! И скорость замечательная.

433 rows in set (0.25 sec)

Неактивен

 

#7 25.04.2010 02:38:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: При выборке виснет машина - нужна помощь в оптимизации запроса

Покажите explain запароса и show create table table_links;
Возможно можно будет ещё улучшить.

Неактивен

 

#8 25.04.2010 12:41:39

AlexGinSQLinfo
Участник
Зарегистрирован: 23.04.2010
Сообщений: 5

Re: При выборке виснет машина - нужна помощь в оптимизации запроса

Explain запроса:

+----+-------------+-------------------+------+--------------------------------+-----------------+---------+--------------+-------+---------------------------------+
| id | select_type | table             | type | possible_keys                  | key             | key_len | ref          | rows  | Extra                           |
+----+-------------+-------------------+------+--------------------------------+-----------------+---------+--------------+-------+---------------------------------+
|  1 | PRIMARY     | <derived2>        | ALL  | NULL                           | NULL            | NULL    | NULL         |     3 |                                 |
|  1 | PRIMARY     | t1                | ref  | products_index,index_search_id | index_search_id | 4       | t2.search_id |    13 | Using where                     |
|  2 | DERIVED     | table_links       | ALL  | NULL                           | NULL            | NULL    | NULL         | 24578 | Using temporary; Using filesort |
+----+-------------+-------------------+------+--------------------------------+-----------------+---------+--------------+-------+---------------------------------+
3 rows in set (0.13 sec)

Не стоит на самом деле копаться дальше - пока всё отлично, если будут проблемы - обязательно напишу

Ещё раз спасибо

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson