web-dev-qa-db-ja.com

列ごとの順序にインデックスがあるかどうか

検索結果に使用するインデックスをテーブルに追加しました。 ASCまたはDESCの順序で結果を表示しています。だからその列はインデックスを持つべきかどうか?そのテーブルにさらに2つのインデックスがあります。その列にインデックスを作成するかどうかによって、パフォーマンスはどのように影響しますか?

38
Somnath Muluk

はい、MySQLはORDER BYのカラムにインデックスを使用できます(特定の条件下で)。ただし、MySQLはmixed ASC、DESCのインデックスを使用できません(SELECT * FROM foo ORDER BY bar ASC, pants DESC)。クエリとCREATE TABLEステートメントを共有すると、より具体的に質問に答えることができます。

ORDER BY句を最適化する方法のヒント: http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

編集2012-01-21 8:53 AM

ORDER BYでASC/DESCが混在するインデックスを使用することについて、私の声明の出所について質問がありました。 ORDER BY最適化 ドキュメントから:

MySQLはインデックスを使用してORDER BYを解決できない場合がありますが、インデックスを使用してWHERE句に一致する行を検索します。これらのケースには、次のものがあります。

...

ASCとDESCを混在させます。

SELECT * FROM t1 ORDER BY key_part1 DESC、key_part2 ASC;

...

また、DESCキーワードはCREATE INDEXでは 無意味 です。

Index_col_nameの指定は、ASCまたはDESCで終了できます。これらのキーワードは、昇順または降順のインデックス値ストレージを指定する将来の拡張で許可されています。現在、それらは解析されますが無視されます。インデックス値は常に昇順で格納されます。

29
Aaron Brown

PostgreSQLに関連する答えについて疑問に思う方は、答えは「はい」です。インデックスが使用されます。 PostgreSQLドキュメント のとおり、クエリプランナーは、「仕様に一致する使用可能なインデックスをスキャンするか、物理的な順序でテーブルをスキャンして明示的な並べ替えを行うことにより、ORDER BY仕様を満たすことを検討します。」これは、プランナが使用できるインデックスがある場合はそれを実行し、一致する行を取得した後にソートを実行するようにフォールバックすることを意味します。

6
douglasr