1

1つのMySQLデータベーステーブルに、次のインデックスがあります。

  • タイプ:BTREE
  • ユニーク:いいえ
  • パック:いいえ
  • フィールド:姓、名、年齢

このようなクエリを実行すると...

SELECT firstname, lastname FROM table ORDER BY lastname ASC, firstname ASC, age DESC

...MySQLはインデックスを使用しません。

しかし、「年齢」を昇順で使用すると、次のようになります。

SELECT firstname, lastname FROM table ORDER BY lastname ASC, firstname ASC, age ASC

なんでそうなの?列は常に昇順でのみインデックス付けされますか?または、それらすべてを降順で使用することもできますか?混合注文を使用できないのはなぜですか?

前もって感謝します!

4

1 に答える 1

5

現時点では(MySQL 5.6以下)、インデックスはすべて昇順で実装されています。

ORDER句で順序(ASCとDESC)を混在させる場合、順序が変更されるポイントを超えてインデックスを使用することはできません。

すべてのASCを指定すると、インデックスを完全に利用できます。すべてのDESCを指定しても、完全に利用できます。MySQLのみがインデックスを逆方向にトラバースします。

逆の年齢(max_age-age)を持つ別の列を追加し、代わりにその列にインデックスを付けて、すべての列にASCを使用できるようにすることができます。

于 2012-08-02T14:54:22.793 に答える