mysql - 加速连接表

标签 mysql join

在连接 3 个表时,我设法在连接前两个表时获得结果:

SELECT so.id, so.title, so.cat, sr.img
FROM extended_details AS so
JOIN details AS sr ON so.id = sr.id
LIMIT 6

当我尝试像这样加入第三个表时,问题就出现了:

SELECT so.id, so.title, so.cat, sr.img
FROM extended_details AS so
JOIN details AS sr ON so.id = sr.id
JOIN scores AS se ON sr.id = se.id 
ORDER BY score_sec DESC
LIMIT 6

这似乎要花很长时间,而且我从来没有得到结果,每个表都有大约 300k id,我已经尝试过相关子查询,但恐怕这可能需要更长的时间。

自从运行以来,问题似乎出在 ORDER BY

SELECT so.id, so.title, so.cat, sr.img, se.score
        FROM extended_details AS so
        JOIN details AS sr ON so.id
        JOIN scores AS se ON se.id = sr.id
        LIMIT 6

没有问题。

最佳答案

鉴于问题缺乏详细信息,没有有关主键、唯一索引或其他索引的信息...

我们怀疑缺乏合适的索引导致执行计划效率非常低。

<小时/>

建议:

  • 添加一些适当的索引。

  • 使用EXPLAIN查看查询的执行计划。

  • 如果没有合适的索引,ORDER BY col 将需要对(据报道)大型集合执行“使用文件排序”操作。

  • 在整个结果集排序之后,LIMIT 子句几乎作为最后一步应用。

关于mysql - 加速连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50403404/

相关文章:

mysql - 如何在 MySQL 中计算百分比

mysql - 经典 ASP 添加记录到 MySQL

python - Webiopi (Raspberry pi) 与 sql 或 sqlite

mysql - 连接两个表以从一个表获取 COUNT,从另一个表获取 SUM

java - 有没有HashMap连接元素

mysql - 根据查询表中的单元格获取另一个表中单元格的值

php - 检查重复的product_name PHP

mysql - 如何统计同一个表不同列中的外键?

mysql - 未读私信回复的通知计数

php - 如何在 MySQL 中使用 select 进行连接?