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> select version()...

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明MySQL データベースを使用して、...

CSS でフッターの「下部吸収」効果を実現

よく遭遇する問題: 下部の要素を「下部に貼り付ける」効果を CSS でどのように実現するか。この記事...

NavicatがMySQLに接続すると、10060、1045エラーとmy.iniの場所が報告されます。

Navicat は、データベースに接続するときにエラー 10060 および 1045 を報告します...

Vueはダイアログのカプセル化を実装します

目次Vue2 ライティングVue3プラグインのバージョンの記述Vue3 動的コンポーネントの記述書き...

Linux で MySQL のデフォルト エンコーディングを変更する方法

開発プロセス中に、MySQL データベースを復元した後にデータベース データに文字化けが発生した場合...

Ubuntu 16.04 に Docker と nvidia-docker をインストールするための詳細なチュートリアル

目次DockerのインストールNvidia-docker のインストールDockerのインストール1...

格納可能なセカンダリメニューを実装するための JavaScript

JavaScriptで格納可能なセカンダリメニューを実装するための具体的なコードは参考までに。具体...

Nginx の realip モジュールの使い方の基礎学習

序文nginx モジュールには、公式とサードパーティの 2 種類があります。nginx のインストー...

適応的な幅と高さを持つ9つの正方形グリッドの背景画像の切り取りの分析

<br />幅と高さが適応するオリジナルの 9 グリッド レイアウトをベースに、ネットワ...

MySQLステートメントの記述と実行順序を理解するだけです

MySQL ステートメントの書き込み順序と実行順序には大きな違いがあります。書き順、mysql の一...

HTMLがHikvisionカメラのリアルタイム監視機能を実現

最近、同社は CCFA 関連のいくつかの作業を行う予定で、その 1 つはカメラのリアルタイム監視を再...

Vue+ElementUI で超大規模なフォーム例を処理する方法

最近、社内の業務調整により、以前の超長文のロジックが大幅に変更されたため、リファクタリングする予定で...

Vueデータ監視の原理の詳細な説明

<本文> <div id="ルート"> <h1&...

nginx共有メモリの仕組みの詳細な説明

Nginx の共有メモリは、高いパフォーマンスを実現できる主な理由の 1 つであり、主にファイル キ...