优化 MySQL 连接表查询(HABTM 对象关系)
Posted
技术标签:
【中文标题】优化 MySQL 连接表查询(HABTM 对象关系)【英文标题】:Optimizing MySQL Join Table Query (HABTM Object Relationship) 【发布时间】:2011-10-12 01:03:13 【问题描述】:我正在尝试优化此查询,虽然听起来很简单,但我很难弄清楚如何加快它的速度。
我有两个对象,一个 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】:表格布局似乎正确。
为什么是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)
上有索引,对吧?
【讨论】:
我确实有索引。我试图从数据库(类别)中提取一些额外的信息......我只是尝试省略它,它并没有真正影响速度。感谢您的建议!还有什么?以上是关于优化 MySQL 连接表查询(HABTM 对象关系)的主要内容,如果未能解决你的问题,请参考以下文章
在 hasAndBelongsToMany (HABTM) Cakephp 方面需要帮助