mysql - 使得主键+常量可以使用索引

标签 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;

问题是查询花费了很长时间。解释如下:

enter image description here

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

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

最佳答案

您是否尝试将 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;

通常,您希望将索引列保持在 = 的一侧,我倾向于选择左侧。

关于mysql - 使得主键+常量可以使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24997112/

相关文章:

mysql - 在Docker容器中初始化MySQL数据

mysql 不会在连接表和限制上返回不同的结果

mysql - PHPMyAdmin Azure 应用程序服务 - (HY000/2002) : An attempt was made to access a socket in a way forbidden by its access permissions

mysql - EXPLAIN rows 总是返回表中的所有行

选择的mysql时间与实际行不同

mysql - LEFT JOIN 比 INNER JOIN 快得多

php - 如何在 PHP 中将上传的视频文件编码为 .flv 格式

MySQL 到 MSSQL 查询转换

sql - 如何表示(可选)一对(可选)关系

Android:在显示之前对Cursor中的SQL返回值进行算术