2011-10-12 28 views
0

我试图优化这个查询,并且听起来很简单,我很难搞清楚如何加速它。优化MySQL连接表查询(HABTM对象关系)

我有两个对象,一个Widget和一个类别(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下降小部件(这是什么杀死速度),我有时可以有体面的高偏移量(不知道任何事情都可以做到)。

任何与此有关的帮助将不胜感激,或者如果您有任何关于表重构的建议,这也是一种可能性(但假设很多类别和很多小部件没有简单的分片方式)。

谢谢!

回答

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)指标,对不对?

+0

我确实有索引。我试图从数据库(类别)中提取一些额外的信息......我只是试图省略它,并没有真正影响速度。感谢您的建议!还要别的吗? – Harry