MySQL は降順インデックスをサポートしています: インデックス定義内の DESC
は無視されなくなりましたが、キー値が降順で格納されます。 以前は、インデックスを逆の順序でスキャンできましたが、パフォーマンスが低下していました。 降順インデックスは順にスキャンできるため、より効率的です。 降順インデックスを使用すると、オプティマイザが複数カラムインデックスを使用できるようになります (最も効率的なスキャン順序で一部のカラムに昇順が混在し、他のカラムに降順が混在している場合)。
カラムの昇順インデックスと降順インデックスの様々な組合せに対する 2 つのカラムと 4 つの 2 カラムインデックス定義を含む、次のテーブル定義について考えてみます:
CREATE TABLE t (
c1 INT, c2 INT,
INDEX idx1 (c1 ASC, c2 ASC),
INDEX idx2 (c1 ASC, c2 DESC),
INDEX idx3 (c1 DESC, c2 ASC),
INDEX idx4 (c1 DESC, c2 DESC)
);
テーブル定義の結果、4 つの個別インデックスが作成されます。 オプティマイザは、各 ORDER BY
句に対して正引きインデックススキャンを実行できるため、filesort
操作を使用する必要はありません:
ORDER BY c1 ASC, c2 ASC -- optimizer can use idx1
ORDER BY c1 DESC, c2 DESC -- optimizer can use idx4
ORDER BY c1 ASC, c2 DESC -- optimizer can use idx2
ORDER BY c1 DESC, c2 ASC -- optimizer can use idx3
降順インデックスの使用には、次の条件があります:
-
降順インデックスは
InnoDB
ストレージエンジンでのみサポートされますが、次の制限があります:インデックスに降順のインデックスキーカラムが含まれている場合、または主キーに降順のインデックスカラムが含まれている場合、変更バッファリングはセカンダリインデックスではサポートされません。
InnoDB
SQL パーサーは降順インデックスを使用しません。InnoDB
全文検索の場合、これは、インデックス付きテーブルのFTS_DOC_ID
カラムに必要なインデックスを降順インデックスとして定義できないことを意味します。 詳細は、セクション15.6.2.4「InnoDB FULLTEXT インデックス」を参照してください。
降順インデックスは、昇順インデックスが使用可能なすべてのデータ型でサポートされています。
降順インデックスは、通常の (生成されない) カラムおよび生成されるカラム (
VIRTUAL
とSTORED
の両方) でサポートされます。DISTINCT
では、降順のキー部分など、一致するカラムを含む任意のインデックスを使用できます。降順のキー部分を持つインデックスは、集計関数を呼び出すが
GROUP BY
句を持たないクエリーのMIN()
/MAX()
最適化には使用されません。-
降順インデックスは
BTREE
ではサポートされていますが、HASH
インデックスではサポートされていません。 降順インデックスは、FULLTEXT
またはSPATIAL
インデックスではサポートされていません。HASH
、FULLTEXT
およびSPATIAL
インデックスに対して明示的に指定されたASC
およびDESC
の指定では、エラーが発生します。