如何判断MySQL中是否使用索引进行排序?


10

我有一个带有ORDER BY子句的查询,该子句使用一列,该列是WHERE子句中使用的索引的最后一列,本质上是以下形式:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

并按此顺序在列(col_1,col_2,col_3,col_4)上创建索引。

当我分析查询时,超过99%的时间用于“排序结果”状态。如果有区别,col_4是一个时间戳列。我了解到ORDER BY只能在某些情况下使用索引,但是对于优化器何时才能使用它仍然有些困惑。

Answers:


13

您应该EXPLAIN EXTENDED在查询之前追加并自己查看结果。

它应该有一个条目

  • 可能的钥匙

如果此列为NULL,则没有相关索引。在这种情况下,您可以通过检查WHERE子句来检查它是否引用了某些适合索引的列,从而可以提高查询性能。

  • 按键

key列指示MySQL实际决定使用的密钥(索引)。如果MySQL决定使用mays_keys索引之一来查找行,则将该索引列为键值。

有关更多信息,您可以参考此Explain输出Explain join_types


我的问题特别是与ORDER BY子句有关。我的查询使用指定的索引来限制返回的行,但是考虑到排序的性能,我猜测它没有将其用于ORDER BY子句。
克里斯·库珀

1
在某些情况下,MySQL可以使用索引来满足ORDER BY子句,而无需进行任何额外的排序。即使ORDER BY与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的ORDER BY列在WHERE子句中都是常量即可。以下查询使用索引来解析ORDER BY部分,请参考以下dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil 2012年

1

EXPLAIN在查询(explain select-or-whatever-your-query-is)上使用。

possible_keys显示可以使用的,key实际使用的。


1
补充一点:explain format=json select ...更加强大。它包括used_key_parts,它告诉您是否部分或完全使用了组合键,并index_condition告诉您查询的哪一部分负责哪个索引。
okdewit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.