【发布时间】:2017-03-21 04:26:49
【问题描述】:
下面的查询需要大约 2 秒,对于只有大约 3000 行左右的 2 个表进行如此简单的连接,这似乎真的很长。
我强烈怀疑问题出在这一行:
但我不知道为什么。或者,也许连接条件搞砸了?
SELECT DISTINCT
, idnum
, DATEDIFF( DATE_ADD(atable.adate, INTERVAL 10 DAY), btable.bdate) as `DIFF`
FROM atable
LEFT JOIN btable
ON atable.idnum = btable.idnum
;
我的问题类似于this,但不一样。提前感谢伟大的 SO 社区查看此内容。
【问题讨论】:
-
最可能的解释是没有合适的索引。 DISTINCT 关键字将强制 MySQL 执行“使用文件排序”操作来识别和删除重复项。使用 EXPLAIN 查看执行计划。并确保 btable 具有以 idnum 为前导列的索引。理想情况下,覆盖两个表的索引.... ON btable (idnum,bdate) 和 ON atable (idnum,adate)。我怀疑 DATEDIFF 和 DATE_ADD 函数的性能影响可以忽略不计。我怀疑高杆正在实现结果和“使用文件排序”操作。
-
感谢您的帮助。解释告诉我这是一个“全部”类型的连接。你是对的——注释掉 DATEDIFF 部分并没有加快查询速度!
-
如果没有 WHERE 子句(atable 上的任何谓词),我们希望 EXPLAIN 显示“all”...查询必须访问 atable 中的每一行。我们想知道的是外部连接到
btable的访问计划。理想情况下,使用覆盖索引,我们会在 Extra 列中看到“使用索引”。type列中显示的内容将取决于 btable 中idnum的唯一性和可空性,以及合适索引的可用性。 . -
请为两张表提供
SHOW CREATE TABLE。 -
SELECT中的表达式与速度的关系相对较小。所以,我声明 DATEADD 和 DATEDIFF 不是反派。
标签: mysql datediff query-performance