MySQL 8.0 の降順インデックス

MySQL 8.0 の降順インデックス

序文

インデックスが順序付けられていることは誰もが知っていると思いますが、MySQL の以前のバージョンでは昇順インデックスのみがサポートされ、降順インデックスはサポートされていなかったため、問題が発生していました。最新の MySQL 8.0 バージョンでは、降順インデックスがようやく導入されました。次に、降順インデックスについて見ていきます。

降順インデックス

単一列インデックス

(1)テストテーブル構造を見る

mysql> show テーブル sbtest1\G を作成します
************************** 1. 行 ****************************
    テーブル: sbtest1
テーブルの作成: CREATE TABLE `sbtest1` (
 `id` int unsigned NOT NULL AUTO_INCREMENT,
 `k` int unsigned NOT NULL デフォルト '0',
 `c` char(120) NOT NULL デフォルト ''
 `pad` char(60) NOT NULL DEFAULT ''
 主キー (`id`)、
 キー `k_1` (`k`)
) エンジン=InnoDB AUTO_INCREMENT=1000001 デフォルト文字セット=utf8mb4 COLLATE=utf8mb4_0900_ai_ci MAX_ROWS=1000000
セット内の 1 行 (0.00 秒)

(2)SQL文order by ... limit nを実行します。デフォルトは昇順で、インデックスが使用できます。

mysql> explain select * from sbtest1 order by k limit 10;
+----+-------------+----------+-----------+--------+---------------+-------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+--------+---------------+-------+-------+------+------+------+------+
| 1 | SIMPLE | sbtest1 | NULL | インデックス | NULL | k_1 | 4 | NULL | 10 | 100.00 | NULL |
+----+-------------+----------+-----------+--------+---------------+-------+-------+------+------+------+------+
セットに 1 行、警告 1 件 (0.00 秒)

(3)SQL文order by ... desc limit nを実行します。順序が降順の場合、インデックスは使用できません。逆順でもスキャンできますが、パフォーマンスに影響します。

mysql> explain select * from sbtest1 order by k desc limit 10;
+----+-------------+----------+-----------+---------+-------+-------+--------+---------------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+-------+-------+--------+---------------------+
| 1 | SIMPLE | sbtest1 | NULL | インデックス | NULL | k_1 | 4 | NULL | 10 | 100.00 | 後方インデックススキャン |
+----+-------------+----------+-----------+---------+-------+-------+--------+---------------------+
セットに 1 行、警告 1 件 (0.00 秒)

(4)降順インデックスを作成する

mysql> テーブル sbtest1 を変更し、インデックス k_2(k desc) を追加します。
クエリは正常、影響を受けた行は 0 行 (6.45 秒)
レコード: 0 重複: 0 警告: 0

(5)SQL文order by ... desc limit nを再度実行すると、降順インデックスが使用できるようになります。

mysql> explain select * from sbtest1 order by k desc limit 10;
+----+-------------+----------+-----------+--------+---------------+-------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+--------+---------------+-------+-------+------+------+------+------+
| 1 | SIMPLE | sbtest1 | NULL | インデックス | NULL | k_2 | 4 | NULL | 10 | 100.00 | NULL |
+----+-------------+----------+-----------+--------+---------------+-------+-------+------+------+------+------+
セットに 1 行、警告 1 件 (0.00 秒)

複数列インデックス

(1)テストテーブル構造を見る

mysql> show テーブル sbtest1\G を作成します
************************** 1. 行 ****************************
    テーブル: sbtest1
テーブルの作成: CREATE TABLE `sbtest1` (
 `id` int unsigned NOT NULL AUTO_INCREMENT,
 `k` int unsigned NOT NULL デフォルト '0',
 `c` char(120) NOT NULL デフォルト ''
 `pad` char(60) NOT NULL DEFAULT ''
 主キー (`id`)、
 キー `k_1` (`k`)、
 キー `idx_c_pad_1` (`c`,`pad`)
) エンジン=InnoDB AUTO_INCREMENT=1000001 デフォルト文字セット=utf8mb4 COLLATE=utf8mb4_0900_ai_ci MAX_ROWS=1000000
セット内の 1 行 (0.00 秒)

(2)複数列インデックスの場合、降順インデックスがない場合、SQL 1のみがインデックスを使用でき、SQL 4は逆順にスキャンでき、他の2つのSQL文はフルテーブルスキャンしか実行できないため、非常に非効率的です。

SQL 1: select * from sbtest1 order by c,pad limit 10;

SQL 2: select * from sbtest1 order by c,pad desc limit 10;

SQL 3: select * from sbtest1 order by c desc, pad limit 10;

SQL 4: explain select * from sbtest1 order by c desc, pad desc limit 10;

mysql> explain select * from sbtest1 order by c,pad limit 10;
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| 1 | シンプル | sbtest1 | NULL | インデックス | NULL | idx_c_pad_1 | 720 | NULL | 10 | 100.00 | NULL |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
セットに 1 行、警告 1 件 (0.00 秒)

mysql> explain select * from sbtest1 order by c,pad desc limit 10;
+----+-------------+----------+-----------+--------+---------------+-----+---------+---------+----------+----------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+--------+---------------+-----+---------+---------+----------+----------------+
| 1 | SIMPLE | sbtest1 | NULL | ALL | NULL | NULL | NULL | NULL | 950738 | 100.00 | filesort を使用 |
+----+-------------+----------+-----------+--------+---------------+-----+---------+---------+----------+----------------+
セットに 1 行、警告 1 件 (0.00 秒)

mysql> explain select * from sbtest1 order by c desc,pad limit 10;
+----+-------------+----------+-----------+--------+---------------+-----+---------+---------+----------+----------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+--------+---------------+-----+---------+---------+----------+----------------+
| 1 | SIMPLE | sbtest1 | NULL | ALL | NULL | NULL | NULL | NULL | 950738 | 100.00 | filesort を使用 |
+----+-------------+----------+-----------+--------+---------------+-----+---------+---------+----------+----------------+
セットに 1 行、警告 1 回 (0.01 秒)

mysql> explain select * from sbtest1 order by c desc,pad desc limit 10;
+----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+---------------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+---------------------+
| 1 | SIMPLE | sbtest1 | NULL | インデックス | NULL | idx_c_pad_1 | 720 | NULL | 10 | 100.00 | 後方インデックススキャン |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+---------------------+
セットに 1 行、警告 1 件 (0.00 秒)

(3)対応する降順インデックスを作成する

mysql> テーブル sbtest1 を変更し、インデックス idx_c_pad_2(c,pad desc) を追加します。
クエリは正常、影響を受けた行は 0 行 (1 分 11.27 秒)
レコード: 0 重複: 0 警告: 0

mysql> テーブル sbtest1 を変更し、インデックス idx_c_pad_3(c desc,pad) を追加します。
クエリは正常、影響を受けた行は 0 行 (1 分 14.22 秒)
レコード: 0 重複: 0 警告: 0

mysql> テーブル sbtest1 を変更し、インデックス idx_c_pad_4(c desc,pad desc) を追加します。
クエリは正常、影響を受けた行は 0 行 (1 分 8.70 秒)
レコード: 0 重複: 0 警告: 0

(4)SQLを再度実行すると降順インデックスが使えるようになり、効率が大幅に向上する

mysql> explain select * from sbtest1 order by c,pad desc limit 10;
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| 1 | シンプル | sbtest1 | NULL | インデックス | NULL | idx_c_pad_2 | 720 | NULL | 10 | 100.00 | NULL |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
セットに 1 行、警告 1 件 (0.00 秒)

mysql> explain select * from sbtest1 order by c desc,pad limit 10;
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| 1 | シンプル | sbtest1 | NULL | インデックス | NULL | idx_c_pad_3 | 720 | NULL | 10 | 100.00 | NULL |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
セットに 1 行、警告 1 件 (0.00 秒)

mysql> explain select * from sbtest1 order by c desc,pad desc limit 10;
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
| 1 | シンプル | sbtest1 | NULL | インデックス | NULL | idx_c_pad_4 | 720 | NULL | 10 | 100.00 | NULL |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+------+------+------+------+
セットに 1 行、警告 1 件 (0.00 秒)

要約する

MySQL 8.0 で導入された降順インデックスの最も重要な機能は、インデックスが複数列のソートに使用できないという問題を解決し、より多くのアプリケーション シナリオをカバーすることです。

上記は、MySQL 8.0 の降順インデックスの詳細です。MySQL 降順インデックスの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL 8.0の新機能、隠しフィールドの詳細な説明
  • MySQL 8の新機能である降順インデックスの基礎となる実装の詳細な説明
  • MySQL 8 の新機能: 降順インデックスの詳細
  • MySQL 8で追加された3つの新しいインデックスは、非表示、降順、関数です。

<<:  Nginx サーバーで URL リンクを設定する方法

>>:  JavaScript にはすでに Object があるのに、なぜ Map が必要なのでしょうか?

推薦する

MySQL 権限制御の詳細な説明

目次mysql 権限制御権限システムテーブル変更後にMySQLの権限を有効にする方法権限の付与と取り...

JavaScript で知らない Object.entries の使い方

目次序文1. 共通オブジェクトを反復処理するには for...of を使用します2. 通常のオブジェ...

音楽プレーヤーアプリ(アプリケーションソフトウェア)の分析と再設計 美しい音楽プレーヤーインターフェースの設計方法

無線インタラクションにずっと興味があったので、今回は実践してみようと思います〜この分析と評価は iO...

Linux の netstat コマンドの詳細な紹介

目次1. はじめに2. 出力情報の説明3. netstatの共通パラメータ4. netstatネット...

完璧なアロエベラジェルを選ぶには?完璧なアロエベラジェルの本物と偽物の見分け方

最新のパーフェクト アロエ ベラ ジェルのパッケージ ボックスには、赤いフォントで完璧な英語の文字が...

jsでユーザー登録機能を実装する

この記事の例では、ユーザー登録機能を実装するためのjsの具体的なコードを参考までに共有しています。具...

純粋な HTML+CSS でオリンピック リングを実装するためのサンプル コード

レンダリング コード - 青と黄色のリングを例に挙げます <div class="コ...

React は入力値を取得し、2 つのメソッドの例を送信します

方法1: DOMが提供するイベントオブジェクトのターゲットイベント属性を使用して値を取得し、送信する...

簡単な計算機を実装する小さなプログラム

この記事の例では、簡単な計算機を実装するための小さなプログラムの具体的なコードを参考までに共有してい...

VMware 仮想マシンのインストール Linux システムのグラフィック チュートリアル

この記事では、LinuxシステムのVMwareインストールの具体的な手順を参考までに紹介します。具体...

Vueルーティングルーターの詳細な説明

目次ルーティングプラグインをモジュール方式で使用するルートの使用宣言型ナビゲーションプログラムによる...

HTMLでvueとel​​ement-uiを直接参照する方法

コードは次のようになります。 <!DOCTYPE html> <html> ...

Dockerは複数のポートマッピングコマンドを有効にします

次のように: docker run -d -p 5000:23 -p 5001:22 --name ...

Ubuntuのpython3でvenvを使用して仮想環境を作成する

1. 仮想環境はプロジェクトに従い、単一のプロジェクト用の仮想環境を作成します(Python 3.4...

Windows Server 2008 R2 マルチユーザー リモート デスクトップ接続ライセンス

仕事ではリモート サーバーが必要になることが多く、次の 2 つの問題に遭遇することがよくあります。 ...