MySQLでのソートにインデックスが使用されているかどうかを確認するにはどうすればよいですか?


10

WHERE句で使用されているインデックスの最後の列である列を使用するORDER BY句を含むクエリがあります。

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は特定の状況でのみインデックスを使用できることを理解していますが、オプティマイザがいつ使用するかについては、まだ少し不思議です。

回答:


13

EXPLAIN EXTENDEDクエリの前に追加して、自分で結果を確認する必要があります。

のエントリが必要です

  • possible_keys

この列がNULLの場合、関連するインデックスはありません。この場合、WHERE句を調べて、インデックス付けに適した列を参照しているかどうかを確認することにより、クエリのパフォーマンスを向上させることができる場合があります。

そして

  • キー

キー列は、MySQLが実際に使用することを決定したキー(インデックス)を示します。MySQLがpossible_keysインデックスの1つを使用して行を検索することを決定した場合、そのインデックスはキー値としてリストされます。

詳細については、このExplain出力Explain join_typesを参照してください。


私の質問、特にORDER BY句に関することを理解しています。私のクエリは、返される行を制限するために指定されたインデックスを使用していますが、並べ替えのパフォーマンスを考えると、ORDER BY句には使用されていないと思います。
クリスクーパー

1
場合によっては、MySQLはインデックスを使用して、余分なソートを行わずにORDER BY句を満たすことができます。インデックスのすべての未使用部分とすべての追加のORDER BY列がWHERE句の定数である限り、ORDER BYがインデックスと完全に一致しない場合でも、インデックスを使用できます。次のクエリは、インデックスを使用してORDER BY部分を解決します。このdev.mysql.com/doc/refman/5.0/en/order-by-optimization.htmlを
Mahesh Patil

1

EXPLAINクエリで使用します(explain select-or-whatever-your-query-is)。

possible_keys使用できるもの、key実際に使用されたものを示します。


1
それに追加するには:explain format=json select ...より強力です。これにはused_key_parts、複合キーが部分的に使用されたか完全に使用されたかindex_conditionを通知し、クエリのどの部分がどのインデックスを担当しているかを通知します。
okdewit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.