Mysql 使用 'like' 时日期时间索引不起作用

Mysql datetime index is not working while using 'like'

我在 MySQL 中创建了一个 table:

CREATE TABLE index_test(
   moment DATETIME,
   one_more_attr VARCHAR(10)
);
ALTER TABLE index_test ADD INDEX(moment);

有两个查询字符串:

A: `SELECT * FROM index_test WHERE moment LIKE '2015-06-08%'` 

B: `SELECT * FROM index_test WHERE moment BETWEEN '2015:06:08 00:00:00' AND '2015:06:08 23:00:00'`

使用'explain'语句,发现语句B使用了索引,而A没有。

当我制作 'moment' varchar 时,它们都使用索引。谁能告诉我原因吗?

要解决此查询:

SELECT * FROM index_test WHERE moment LIKE '2015-06-08%'

MySQL 必须将所有日期时间值转换为字符串才能进行比较。

所以它不能使用索引。

在 MySQL 中,DATETIME 类型在内部存储为 8 字节数字, 而不是 作为文本字符串。因此,您在 moment 列上创建的索引将用于查找给定的数字日期 value.

在您的查询中:

SELECT * FROM index_test WHERE moment LIKE '2015-06-08%'

MySQL 引擎首先将 moment 列隐式转换为 VARCHAR 类型,然后与 '2015-06-08%'.

进行比较