Оптимизация MySQL Join Table Query (HABTM Object Relationship) - PullRequest
0 голосов
/ 12 октября 2011

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

У меня есть два объекта, виджет и категория(Отношение HABTM), с таблицами "виджеты", "категории" и "категории_виджеты" (объединяющая таблица).Я пытаюсь найти все виджеты в определенной категории.Просто верно?Однако в некоторых категориях могут быть виджеты по 10-50 тыс., И на выполнение моих запросов уходит 1-2 секунды (у моего сайта довольно высокий трафик, поэтому это совершенно неприемлемо).

Вот что я сейчас делаю:

SELECT * FROM `categories` 
LEFT JOIN `categories_widgets` ON `categories_widgets`.`category_id`=`categories`.`id`
JOIN `widgets` ON `widgets`.`id`=`categories_widgets`.`widget_id`
ORDER BY `widgets`.`id` DESC
LIMIT 0,10

Мне нужно упорядочить виджеты по убыванию идентификатора (это то, что убивает скорость), и я иногда могу иметь прилично высокие смещения (не уверен, что с этим можно что-то сделать).

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

Спасибо!

1 Ответ

0 голосов
/ 12 октября 2011

Таблица выглядит правильно.
Почему LEFT JOIN?Я сделал это JOIN.
Где ваше предложение WHERE?msgstr "найти все виджеты в определенной категории."

SELECT *
  FROM categories_widgets cw
  JOIN widgets w  ON w.id = cw.widgets_id
 WHERE cw.category_id = $my_cat_id
 ORDER BY w.id DESC
 LIMIT 0,10

И у вас есть индексы на categories_widgets(category_id) и widgets(id), верно?

...