mysql - MySQL 可以在带 ORDER BY 的 RANGE QUERY 中使用索引吗?

标签 mysql indexing query-optimization sql-order-by

我有一个 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/

相关文章:

mysql - Laravel 具有多个条件的连接

javascript - 在存在多个 div 的特定 div 中查找项目的索引

c# - 在自定义类上使用字符串索引器

mysql - 如何使用多个连接优化 MySQL 查询?

mysql - SQL处理午夜

php - 通过 PHP 从 mysql 数据库中获取数据

mysql - 数据库设计 : users and guests

mysql - 使用 select count(*) 更新查询速度较慢

php - 每个数据库列一个ID,怎么办?

Django:为什么 Foo.objects.extra(...) 比 Foo.objects.raw 快得多?