优化 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 对象关系)的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp HABTM 连接表为空

Mysql查询优化从入门到跑路查询的基本操作

在 hasAndBelongsToMany (HABTM) Cakephp 方面需要帮助

Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?

CakePHP 保存 HABTM 数据

如何将数据写入 CakePHP 中 HABTM 连接表的 HABTM 关联?