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学習データベース検索文DQL小百章

目次1. データの簡単な取得2. データの並べ替えと取得2.1. 基本構文2.2. ソート方向を指定...

JavaScript マクロタスクとマイクロタスク

マクロタスクとマイクロタスクJavaScript はシングルスレッド言語です (マルチスレッドの場合...

v-html レンダリング コンポーネントの問題

以前 HTML を解析したことがあるので、今日は Vue ドラッグ アンド ドロップを使用して、Ku...

MySQL データ型の最適化の原則

MySQL は多くのデータ型をサポートしており、高パフォーマンスを得るには適切なデータ型を選択するこ...

MySQL 8.0.19 のインストールと設定方法のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.19のインストールと設定のグラフィックチュートリアルを記...

mysqlは2つ以上のフィールドがNULLであるレコードを見つける問題を解決します

コアコード /*-------------------------------- 2つ以上のフィール...

CSS3で実装された天気アイコンのアニメーション効果

成果を達成する 実装コードhtml <div class="wrapper"...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

CSS変数を使用して、クールで素晴らしいフローティング効果を実現します。

最近、Grover の Web サイトで楽しいホバー アニメーションを見つけ、自分自身のインスピレー...

ReactでuseStateを使用する詳細な例

使用状態useState は、関数コンポーネント内で呼び出すことで、コンポーネントに内部状態を追加し...

SELINUXの動作原理の詳細な説明

1. はじめにSELinux が Linux にもたらす主な価値は、柔軟で構成可能な MAC メカニ...

MySQLでユーザーを作成し、権限を管理する方法

1. ユーザーとパスワードの作成方法1. MySQLデータベースに入る mysql> mysq...

Navicat 接続 MySQL エラーの説明分析

目次環境仮想マシンバージョンMySQL バージョン事前準備MySQLの実行ステータスを確認するルート...

Linux で実行可能ファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される場合の解決策

最近、Linux オペレーティング システムを使用して実行可能ファイルを実行していたところ、「そのよ...