我有一个 MySQL 表:
CREATE TABLE mytable (
id INT NOT NULL AUTO_INCREMENT,
other_id INT NOT NULL,
expiration_datetime DATETIME,
score INT,
PRIMARY KEY (id)
)
我需要以以下形式运行查询:
SELECT * FROM mytable
WHERE other_id=1 AND expiration_datetime > NOW()
ORDER BY score LIMIT 10
如果我将这个索引添加到我的表中:
CREATE INDEX order_by_index
ON mytable ( other_id, expiration_datetime, score);
MySQL 能否在上面的查询中使用整个 order_by_index
?
看起来应该可以,但是根据MySQL的documentation : "即使 ORDER BY 与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的 ORDER BY 列都是 WHERE 子句中的常量。”
上面这段话似乎暗示索引只能用于常量查询,而我的是范围查询。
任何人都可以澄清在这种情况下是否会使用索引吗?如果没有,有什么办法可以强制使用索引?
谢谢。
最佳答案
MySQL 将使用索引来满足 where 子句,并将使用文件排序对结果进行排序。
它不能使用索引作为排序依据,因为您没有将 expiration_datetime 与常量进行比较。因此,返回的行在索引中并不总是具有共同的前缀,因此索引不能用于排序。
例如,假设您的表有一组 4 条索引记录:
a) [1,'2010-11-03 12:00',1]
b) [1,'2010-11-03 12:00',3]
c) [1,'2010-11-03 13:00',2]
d) [2,'2010-11-03 12:00',1]
如果我在 2010-11-03 11:00 运行您的查询,它将返回索引中不连续的行 a、c、d。因此 MySQL 需要执行额外的传递来对结果进行排序,并且在这种情况下不能使用索引。
关于mysql - MySQL 可以在带 ORDER BY 的 RANGE QUERY 中使用索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083632/