我在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时,他们都使用索引。有人可以告诉我原因吗?
答案 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才能进行比较。
所以它不能使用索引。