23

次のような自動インクリメントのint列にキー設定されたユーザーテーブルがあります。

CREATE TABLE `user_def` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(20) NOT NULL,
  `date_created` datetime NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_name_UNIQUE` (`user_name`),
) ENGINE=MyISAM

デフォルトのASCではなくDESCインデックス(主キー)を使用することによる実用的なパフォーマンス上の利点はありますか?

私の疑惑/理由は次のとおりです。最近のユーザーがよりアクティブになる(つまり、テーブルに頻繁にアクセスする)ため、インデックスがより効率的になると想定しています。

私の理解は正しいですか?

4

4 に答える 4

25

MySQL8.0の回答を更新

コメントでKazimierasAliulisが指摘しているように、MySQL8.0では降順インデックスのサポートが追加されています

MySQLは降順のインデックスをサポートします。インデックス定義のDESCは無視されなくなりましたが、降順でキー値が保存されます。以前は、インデックスを逆の順序でスキャンできましたが、パフォーマンスが低下していました。降順のインデックスは順方向にスキャンできるため、より効率的です。降順インデックスを使用すると、最も効率的なスキャン順序で一部の列の昇順と他の列の降順が混在している場合に、オプティマイザーが複数列のインデックスを使用することもできます。


以前のバージョンの元の回答

DESCインデックス作成は現在MySQLに実装されていません...エンジンは提供されたソートを無視し、常に以下を使用しますASC

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

SQL Serverなど、この機能を実装する別のRBDMSの場合DESC仕様は複合インデックスで並べ替える場合にのみ有益であり、新しく作成されたユーザーと古いユーザーのルックアップ時間には影響しません。

于 2012-04-12T19:17:09.377 に答える
10

MySQL 5.6のドキュメントから:

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

于 2012-12-25T13:02:14.143 に答える
7

いつの日か、mysql の降順インデックスを作成する方法という、シンプルでありながら見事なトリックが与えられました。負の値 (ミラー値) を持つ別の列を追加するだけです。たとえば、 unsigned int の場合はそのままになりますvalue*-1-つまり、UNIXタイムスタンプで機能します。
varchar の場合、考え方は似ていますが、実装はもう少し複雑です。

于 2012-12-25T13:26:03.647 に答える
0

MySQL では、インデックスに ASC または DESC を定義することはサポートされていないだけでなく、無意味でもあります。MySQL は、必要に応じて両方向にインデックスをトラバースできるため、順序を明示的に定義する必要はありません。

于 2012-04-13T13:04:51.510 に答える