Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Проблема заключается в следующем:
Запрос:
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 были добавлены индексы.
===
Подскажите пожалуйста как можно оптимизировать этот зарос?
Неактивен
Не обращайте внимания на "; в конце запроса - из кода копировал
Полный запрос
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%');
Неактивен
В пятой версии неправильно работают подзапросы вида IN (SELECT .. GROUP BY) они выполняются для каждой строки основного запроса.
Попробуйте переписать ваш запрос через JOIN:
Неактивен
Пока ещё не работает запрос, выдаёт
ERROR 1054 (42S22): Unknown column 'search_id' in 'from clause'
Но за своет по поводу IN / JOIN огромное спасибо
Неактивен
Забыл MAX(search_id) переименовать в search_id. Так должно работать:
Неактивен
Vasya, огромнейшее спасибо! Заработало! И скорость замечательная.
433 rows in set (0.25 sec)
Неактивен
Покажите explain запароса и show create table table_links;
Возможно можно будет ещё улучшить.
Неактивен
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)
Не стоит на самом деле копаться дальше - пока всё отлично, если будут проблемы - обязательно напишу
Ещё раз спасибо
Неактивен
Страниц: 1