34

フィールドの降順で行を取得する必要があるテーブルがあります。EXPLAIN次のようなクエリを実行する場合:

EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC

Using where; Using filesortExtraコラムに入ります。DESCだから私はインデックスを作成しようとします:

CREATE INDEX name ON table (field DESC);

しかし、EXPLAINもう一度実行するとUsing where; Using filesortExtra列で同じ結果が得られ、パフォーマンスはほとんど同じです。

私は何が間違っているのですか?

4

3 に答える 3

58

これは、MySQLの「機能」の1つであり、単に実装されていないため、何かを実行するという要求を黙って無視します。

http://dev.mysql.com/doc/refman/5.5/en/create-index.htmlから

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

于 2012-04-11T15:33:42.077 に答える
13

MySQLは、バージョン8以降、降順のインデックスをサポートしています。以前のバージョンでは、インデックスを作成するときに「DESC」句は黙って無視されていました。これは、(a)単一列インデックスまたは(b)すべての列が一方向(すべてASCまたはすべてDESC)である複数列インデックスの場合は問題ではありませんでした。インデックスは双方向であるためです。

ただし、列の方向が異なる複数列のインデックスが必要な場合、たとえば、次のような複数のクエリを実行します。

SELECT * from MyTable WHERE ColumnA = 1 ORDER BY ColumnB ASC, ColumnC DESC

次のインデックスが必要でした:(ColumnA、ColumnB ASC、ColumnC DESC)。

バージョン8より前のMySQLでは、これらのパラメーターを使用してインデックスを作成できましたが、実際には、すべての列が昇順(ColumnA ASC、ColumnB ASC、ColumnC ASC)でサイレントに作成されました。

そのため、クエリはそのインデックスを完全に使用できませんでした。列Cにインデックス付けされていない(ファイルソート)データを使用している間、インデックスから列AとBのみを取得しました。

これは、MySQL8.0以降のバージョンでは問題になりません。https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.htmlを参照してください

MySQLバージョン8は、2018年4月19日に一般提供のためにリリースされました(v8.0.11)。

于 2017-05-11T17:24:21.503 に答える
12

前述のように、この機能は実装されていませんが、いくつかの回避策が必要になる場合があります。

1つの可能性は、フィールドを負の値または逆の値で格納することです。

数値の場合は(-n)、符号なしの場合は(MAXVAL -n)を格納できます

日付またはタイムスタンプの場合、代わりに数値を格納し、FROM_UNIXTIME()などの関数を使用することを推奨する人もいます。

もちろん、そのような変更は必ずしも簡単に行われるとは限りません...既存のコードなどに依存します。

于 2014-12-03T22:11:47.253 に答える