MySQL没有使用ORDER BY的索引

MySQL没有使用ORDER BY的索引,mysql,sql,Mysql,Sql,我在(第1列、第2列、第3列)上有索引,当我运行此查询时 SELECT * FROM table ORDER BY column_1 DESC, column_2 ASC, column_3 ASC 没有使用该索引 我需要使用该索引,因为当我只使用orderbycolumn\u1desc(约0.0005秒)和orderbycolumn\u1desc、column\u2asc、column\u3asc(约0.4秒)时,查询时间有很大差异 此外,该索引甚至没有按列描述的顺序使用 这是EXPLAIN

我在
(第1列、第2列、第3列)
上有索引,当我运行此查询时

SELECT * FROM table ORDER BY column_1 DESC, column_2 ASC, column_3 ASC
没有使用该索引

我需要使用该索引,因为当我只使用
orderbycolumn\u1desc
(约0.0005秒)和
orderbycolumn\u1desc、column\u2asc、column\u3asc
(约0.4秒)时,查询时间有很大差异

此外,该索引甚至没有按列描述的顺序使用

这是
EXPLAIN
对于
按第1列说明、第2列说明、第3列说明的顺序
,仅对
按第1列说明的顺序


不使用索引有什么原因吗?

您的索引定义需要匹配您正在查询的排序顺序,或者至少匹配混合排序方向(即
DESC
ASC
ASC
ASC
DESC
DESC
)。这些文件说:

如果查询混合了ASC和DESC,那么如果索引还使用相应的升序和降序混合列,则优化器可以在列上使用索引。[…]如果key_part1是降序的,key_part2是升序的,那么优化器可以在(key_part1,key_part2)上使用索引。如果键_part1为升序,键_part2为降序,它还可以在这些列上使用索引(向后扫描)


有关更多信息,请参见。

您的索引定义需要匹配您正在查询的排序顺序,或者至少匹配混合排序方向(即
DESC
ASC
ASC
ASC
DESC
DESC
)。这些文件说:

如果查询混合了ASC和DESC,那么如果索引还使用相应的升序和降序混合列,则优化器可以在列上使用索引。[…]如果key_part1是降序的,key_part2是升序的,那么优化器可以在(key_part1,key_part2)上使用索引。如果键_part1为升序,键_part2为降序,它还可以在这些列上使用索引(向后扫描)


有关更多信息,请参见。

asc
desc
使索引有所不同。不应该,但确实如此。不幸的是,MySQL在历史上不支持降序索引。它是什么类型的索引?您的表中有多少列?@M.Kanarkowski index是BTREE,我在该表中有11列,但如果使用索引,这应该无关紧要?
asc
desc
使索引有所不同。不应该,但确实如此。不幸的是,MySQL在历史上不支持降序索引。它是什么类型的索引?您的表中有多少列?@M.Kanarkowski index是BTREE,我在该表中有11列,但如果使用索引,这应该无关紧要。因此解决方案是创建索引
(列1描述,列2,列3)
?我这样做了,但它仍然没有被使用。可能是因为这些列是新的,总共不到100行,所以db引擎决定不使用索引?您可能需要分析表。但是,优化器会考虑先读取索引,然后读取索引指向的行的成本,而不是仅仅读取表。如果认为索引没有帮助,则不会使用它。如果表(整个表?!)只有几百行,那么整个表很可能适合内存,而且索引的好处很小。请注意,使用ASC和DESC列的混合定义索引是MySQL 8.0中的一项新功能。在早期版本的MySQL中,在索引列中声明ASC和DESC被忽略。@BillKarwin这就是问题所在,我有5.6.41版。是的,在5.6中,可以将索引列声明为
DESC
,但它们将只存储为
ASC
。因此解决方案是创建索引
(列1 DESC,列2,列3)
?我这样做了,但它仍然没有被使用。可能是因为这些列是新的,总共不到100行,所以db引擎决定不使用索引?您可能需要分析表。但是,优化器会考虑先读取索引,然后读取索引指向的行的成本,而不是仅仅读取表。如果认为索引没有帮助,则不会使用它。如果表(整个表?!)只有几百行,那么整个表很可能适合内存,而且索引的好处很小。请注意,使用ASC和DESC列的混合定义索引是MySQL 8.0中的一项新功能。在早期版本的MySQL中,在索引的列中声明ASC和DESC被忽略。@BillKarwin这就是问题所在,我有5.6.41版。是的,在5.6中,可以将索引的列声明为
DESC
,但它们只能存储为
ASC