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%'
.
进行比较
我在 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%'
.