【问题标题】:How to avoid Multiple joins for better performance?如何避免多次连接以获得更好的性能?
【发布时间】:2016-12-22 11:42:15
【问题描述】:

我有 5 个表并且都有依赖项,所以我编写了这个查询来获取数据并且它工作正常,但是性能很差,所以你能提出一些概念吗?

SELECT  a.*,cg.*,c.*,qt.*,ct.* 
FROM MYB.choice_table ct 
RIGHT OUTER JOIN MYB.question_table qt ON ct.questionID = qt.questionID 
RIGHT OUTER JOIN MYB.category_table c ON  c.categoryID = qt.categoryID 
RIGHT OUTER JOIN MYB.categoryGroup_table cg ON cg.categoryGroupID=c.categoryGroupID 
RIGHT OUTER JOIN MYB.audit_table a ON a.auditID=cg.auditID 
WHERE a.auditID=123

【问题讨论】:

  • 尽可能将right join 替换为inner join
  • 所有表都正确索引了吗?
  • 虽然阅读右外连接总是有点​​困难,但查询看起来不错并且应该很快。当然,前提是所有 ID 都应有约束和索引。

标签: mysql sql join mariadb


【解决方案1】:

我能立即想到的唯一一件事就是为您用于连接的所有数据编制索引。

你也不应该这样做

Select *

尽量减少你需要的回报

子注释

查看您的查询,它将加入整个数据集,然后在其中搜索您的 where 子句。

假设 a.123 只有 50 个值,但您的所有表都有 10000 行数据。如果每个表有 10000 行 x 多少列返回搜索并获得 50 个值,则您将加入 n 个数量

【讨论】:

  • 你是对的。多张桌子上的厨房水槽查询通常是一团糟。
【解决方案2】:

我建议您使用 EXPLAIN 查看执行计划。 见http://dev.mysql.com/doc/refman/5.7/en/explain.html

此类执行计划将帮助您了解幕后情况并识别潜在问题。加入计数本身并没有减慢速度。

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多