使它成为主键+常量可以使用索引

时间:2014-07-28 14:07:53

标签: mysql sql explain

我正在使用一些时钟软件,并试图找到时钟日志被篡改的证据。这是我的疑问:

EXPLAIN SELECT log1.userName, log1.logID
FROM timeLog log1
JOIN timeLog log2 ON log1.logID = log2.logID + 1
JOIN timeLog log3 ON log1.logID = log3.logID - 1
WHERE log1.timeIN NOT BETWEEN log2.timeIN AND log3.timeIN;

问题是查询需要很长时间。这是EXPLAIN:

enter image description here

因此log2和log3的类型是ALL - 而不是eq_ref。如果将它们与logID而不是logID +/-常数进行比较,则它们将是eq_ref,每行为1行,而每行为259942。

在查找添加到标量常量的索引值时是否可以利用索引?

1 个答案:

答案 0 :(得分:1)

您是否尝试将ON条件重写为:

SELECT log1.userName, log1.logID
  FROM timeLog log1
  JOIN timeLog log2 ON log2.logID = log1.logID - 1
  JOIN timeLog log3 ON log3.logID = log1.logID + 1
 WHERE log1.timeIN NOT BETWEEN log2.timeIN AND log3.timeIN;

一般来说,您希望将索引列保持在=的一侧,而我倾向于左侧。