使用'like'时mysql datetime索引不起作用

时间:2015-06-30 01:44:03

标签: mysql indexing

我在MySQL中创建了一个表:

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时,他们都使用索引。有人可以告诉我原因吗?

2 个答案:

答案 0 :(得分:2)

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

在您的查询中:

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

MySQL引擎首先隐式地将moment列转换为VARCHAR类型,然后对'2015-06-08%'进行比较。

答案 1 :(得分:1)

要解决此问题:

  

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

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

所以它不能使用索引。