使其主键+常量可以使用索引

Posted

技术标签:

【中文标题】使其主键+常量可以使用索引【英文标题】:making it so primary key + constant can use index 【发布时间】:2014-07-28 14:07:53 【问题描述】:

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

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;

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

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

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

【问题讨论】:

【参考方案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;

一般来说,您希望在= 的一侧保持索引列的完整性,我倾向于选择左侧。

【讨论】:

以上是关于使其主键+常量可以使用索引的主要内容,如果未能解决你的问题,请参考以下文章

MyISAM与InnoDB的索引差异

Mysql select with in 子句不使用索引

mysql 主键索引和唯一索引的区别

mysql中,索引,主键,唯一索引,联合索引的区别是?对数据库的性能有啥影响?

MySQL - InnoDB主键索引、普通索引、唯一索引、联合索引

是否可以命名在 oracle 中创建主键期间创建的索引?