У меня есть 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
Кто-нибудь может помочь?