【问题标题】:Optimize Multiple Joins SQL优化多连接 SQL
【发布时间】:2018-10-30 00:52:18
【问题描述】:

我需要将一个表(表 A)中的所有列连接到另外两个表(B 和 C)中的单个列。我的 SQL 可以工作,但速度很慢。问题来自加入 A 和 C。我已经研究过优化,但没有找到任何可以加快速度的方法。不幸的是,我不能改变桌子的设计。

SELECT tableA.*, 
       tableB.user_email,
       tableC.transaction_number 
FROM tableA 
LEFT OUTER JOIN tableB 
   ON tableA.user_id=tableB.id 
LEFT OUTER JOIN tableC 
   ON tableA.user_id=tableC.user_id 
   AND A.timestamp=C.timestamp 
ORDER BY A.timestamp DESC;

感谢您的任何见解!

【问题讨论】:

  • EXPLAIN 输出显示了什么?正在使用哪些索引?
  • 除了解释之外,关于查询性能的问题总是需要针对所有相关表使用 SHOW CREATE TABLE 语句
  • 嗨。请阅读How to Ask、向下投票箭头鼠标悬停文本和minimal reproducible example 并采取行动。 “研究优化”是什么意思?它似乎没有涉及阅读有关 SQL 优化的基础知识,或阅读大量 SO Qs & As re sql 优化,或阅读 MySQL 手册中所有提到的“优化”。 PS 该代码无法编译。

标签: mysql sql wordpress performance left-join


【解决方案1】:

对于您的查询,您需要在 tableB(id, user_email)tableC(user_id, timestamp, transaction_number)tableA(timestamp, user_id) 上建立索引。

我不确定你是否能做得更好。

【讨论】:

  • tableC 上的索引可能包括timestamp 列(transaction_number 列之前),,该列以及user_id 上有一个相等谓词
  • @spencer7593 。 . .谢谢你。我错过了那些是不同的专栏。但我的解释有点愚蠢——因为join 甚至没有必要。
  • tableA: INDEX (timestamp) -- 代表ORDER BY;添加列无济于事
猜你喜欢
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2012-06-28
  • 2018-03-24
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多