MySql product \ tag оптимизация запросов - PullRequest
0 голосов
/ 28 мая 2010

У меня есть SQL-запрос, который я пытаюсь оптимизировать. Он в основном используется для возврата товаров в корзину. К каждому продукту прикреплены теги с использованием таблицы «многие ко многим» product_tag, а также я извлекаю название магазина из отдельной таблицы магазина. Я использую group_concat, чтобы получить список тегов для отображения (вот почему у меня есть странные пункты groupby orderby внизу), и мне нужно упорядочить по дате, сначала показывая последний запланированный продукт. Вот запрос ....

SELECT `products`.*, `stores`.`name`, GROUP_CONCAT(tags.taglabel ORDER BY tags.id ASC SEPARATOR " ") taglist
FROM (`products`)
JOIN `product_tag` ON `products`.`id`=`product_tag`.`productid`
JOIN `tags` ON `tags`.`id`=`product_tag`.`tagid`
JOIN `stores` ON `products`.`cid`=`stores`.`siteid`
WHERE `dateadded` < '2010-05-28 07:55:41'
GROUP BY `products`.`id` ASC
ORDER BY `products`.`dateadded` DESC
LIMIT 2  

К сожалению, даже при небольшом наборе данных (3 тега и около 12 продуктов) выполнение запроса занимает 00,0034 секунды. В конце концов я хочу иметь около 2000 продуктов и 50 тегов в этой системе (я предполагаю, что это будет очень медленно). Вот это ExplainSql ...

id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra
1|SIMPLE|tags|ALL|PRIMARY|NULL|NULL|NULL|4|Using temporary; Using filesort
1|SIMPLE|product_tag|ref|tagid,productid|tagid|4|cs_final.tags.id|2|
1|SIMPLE|products|eq_ref|PRIMARY,cid|PRIMARY|4|cs_final.product_tag.productid|1|Using where
1|SIMPLE|stores|ALL|siteid|NULL|NULL|NULL|7|Using where; Using join buffer

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 01 марта 2011

ИМО, тебе не о чем беспокоиться.

  • Наличие 2000 продуктов НЕ займет 100 раз дольше, чем 20 продуктов. Вот для чего нужны индексы (и базы данных, на самом деле ...).
  • 2000 записей - все еще очень маленькая таблица для MySQL.

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

Только после того, как набор результатов станет действительно большим (больше, чем системная память - например, несколько ГБ), сортировка может занять некоторое время, так как БД будет использовать диск, тогда вы можете начать беспокоиться , В этом случае иногда полезно создать временную таблицу для несортированных результатов, добавить к ней индекс и выбрать из него с помощью ORDER BY.

...