优化MySQL连接表查询(HABTM对象关系)

时间:2011-10-12 01:03:13

标签: mysql sql database database-design query-optimization

我正在尝试优化此查询,并且听起来很简单,我很难弄清楚如何加快速度。

我有两个对象,一个Widget和一个Category(HABTM关系),表格为“widgets”,“categories”和“categories_widgets”(连接表)。我正在尝试查找特定类别中的所有小部件。简单吧?有些类别可以有10-50k小部件,我的查询需要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

我确实需要通过id降序来命令小部件(这就是杀死速度的方式),我有时可以获得相当高的偏移量(不确定是否可以做任何事情)。

任何有关这方面的帮助都会受到赞赏,或者如果您对表重组有任何建议,那也是可能的(但假设有很多类别和许多小部件没有简单的分片方法)。

谢谢!

1 个答案:

答案 0 :(得分:0)

表格布局似乎正确。
为什么LEFT JOIN?我做了JOIN 你的WHERE条款在哪里? “找到特定类别中的所有小部件。”

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)上有索引,对吗?