MySQLはカバーインデックスを使用してテーブルリターンを回避し、クエリを最適化します。

MySQLはカバーインデックスを使用してテーブルリターンを回避し、クエリを最適化します。

序文

カバーリング インデックスについて説明する前に、まずそのデータ構造である B+ ツリーを理解する必要があります。

まず、デモンストレーション用のテーブルを作成します (簡単にするために、ID は順番に作成されます)。

id名前
1ああ
3
5オプ
8ああ
10えーっ
11
14冗談
16ミリリットル
17
18
19
22
24 io
25
29冗談
31冗談
33 rt
34ありがとう
35ユウ
37 rt
39 rt
41ありがとう
45クォート
47ありがとう
53
57グー
61だー

主キー以外の列値をキー値として構築されたB+ツリーインデックスを非クラスター化インデックスと呼びます。

非クラスター化インデックスとクラスター化インデックスの違いは、非クラスター化インデックスのリーフ ノードにはテーブル内のデータが格納されず、列に対応する主キーが格納されることです。データを検索する場合は、主キーに基づいてクラスター化インデックスも検索する必要があります。クラスター化インデックスに基づいてデータを検索するこのプロセスは、テーブル リターンと呼ばれます。

B+ ツリー

B+ ツリーと B ツリーは、MySQL インデックスでよく使用されるデータ構造です。B+ ツリーは、B ツリーをさらに最適化したものです。上記の表を分析のためにグラフに変換してみましょう。

B+ツリーの特徴:

1. B+ツリーの非リーフノードはデータを保存せず、キー値のみを保存します。

2. リーフノードのデータは順番に並べられる

3. B+ツリーのページは双方向リンクリストで接続されています

クラスター化インデックスと非クラスター化インデックス

B+ ツリー インデックスは、保存方法の違いにより、クラスター化インデックスと非クラスター化インデックスに分けられます。

クラスター化インデックス:

ストレージ エンジンとして InnoDB を使用するテーブルの場合、テーブル内のすべてのデータに主キーが設定されます。主キーを作成しなくても、システムによって暗黙的な主キーが作成されます。

これは、InnoDB がデータを B+ ツリーに格納し、B+ ツリーのキー値が主キーとなるためです。テーブル内のすべてのデータは、B+ ツリーのリーフ ノードに格納されます。

主キーを B+ ツリー インデックスのキー値として使用するこのような B+ ツリー インデックスは、クラスター化インデックスと呼ばれます。

非クラスター化インデックス:

主キー以外の列値をキー値として構築されたB+ツリーインデックスを非クラスター化インデックスと呼びます。

非クラスター化インデックスとクラスター化インデックスの違いは、非クラスター化インデックスのリーフ ノードにはテーブル内のデータが格納されず、列に対応する主キーが格納されることです。データを検索する場合は、主キーに基づいてクラスター化インデックスも検索する必要があります。クラスター化インデックスに基づいてデータを検索するこのプロセスは、テーブル リターンと呼ばれます。

カバーインデックスを使用してテーブルバックを回避する方法

非主キー インデックスを使用しているのに、テーブルが返されるのはなぜでしょうか。簡単に言うと、非主キー インデックスは非クラスター化インデックスです。B+ ツリーのツリー子ノードには、主キーと非主キー インデックスのみが保存されます。1 つのクエリで見つけられるのは、この 2 つのフィールドだけです。3 つのフィールドを見つけたい場合は、クラスター化インデックスを再度検索する必要があります。これがテーブルが返される理由です。

たとえば、新しいフィールド age がテーブルに追加され、name を使用してインデックス (非クラスター化インデックス) が作成されます。

id名前
1023
7 ls 54
13わーい12
5ズル76
8 x 23
12 xm 43
17ダイ21

name = 'zs' の場合、ユーザーから id、name を選択します。

名前インデックスにヒットできます。インデックス リーフ ノードには主キー ID が格納されます。ID と名前は、テーブルに戻らずに名前インデックス ツリーを通じて取得できます。これにより、インデックス カバレッジ要件が満たされ、非常に効率的です。

name = 'zs' の場合、ユーザーから id、name、age を選択します。

名前インデックスはヒットできます。インデックス リーフ ノードには主キー ID が格納されていますが、年齢フィールドはクエリのテーブルに戻ることによってのみ取得できるため、インデックス カバレッジを満たしていません。年齢フィールドを取得するには、ID 値を通じてコードを再度スキャンする必要があり、効率が低下します。

結論: では、テーブル リターンを回避するにはどうすればよいでしょうか? 簡単です。単一列インデックス (名前) を結合インデックス (名前、年齢) にアップグレードします。

要約する

これで、MySQL でカバーリング インデックスを使用してテーブル リターンを回避し、クエリを最適化する方法についての記事は終わりです。MySQL でカバーリング インデックスを使用してテーブル リターンを回避し、クエリを最適化する方法についての関連記事については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL のテーブルリターンとインデックスカバレッジの例の詳細な説明
  • MySQL テーブルを返すとインデックスが無効になるケースの説明
  • インデックスとテーブルリターンをカバーするMySQLの使い方
  • MySQLテーブルはパフォーマンスにどの程度のダメージを与えるか

<<:  Vue ライフサイクルの紹介とフック関数の詳細な説明

>>:  初心者がHTMLタグを学ぶ(2)

推薦する

Docker-compose インストール yml ファイルの設定方法

目次1. オフラインインストール2. オンラインインストール3. アンインストール4. ymlファイ...

Linuxはsttyを使用して端末の回線設定を表示および変更します。

Sttty は、Linux で端末設定を変更および印刷するための一般的なコマンドです。 1. パラ...

HTML メタタグの小さなコレクション

<Head>……</head> は <HTML> のファイル ヘ...

Centos7 インストール mysql5.6.29 シェル スクリプト

この記事では、参考までにmysql5.6.29のシェルスクリプトを共有します。具体的な内容は次のとお...

CentOS7 で MySQL データベースにリモート接続できない理由と解決策

序文最近、仕事で問題が発生しました。 Centos7 システムでは MySQL にリモート接続できな...

nginx/apache 静的リソースのクロスドメインアクセスの問題を解決する詳細な説明

1. Apache 静的リソースのクロスドメイン アクセスApache設定ファイルhttpd.con...

ドメイン名を nginx サービスにバインドする方法

nginx.conf で複数のサーバーを設定します。 http リクエストを処理する際、nginx ...

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

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

JavaScript es6 における var、let、const の違いの詳細な説明

まず、よくある質問は、ECMAScript と JavaScript の関係は何ですか? ECMAS...

ウェブデザインにおける画像フォーマットとデザインの関係を詳しく説明

なぜこの領域のコンテンツを整理したいのでしょうか。それは、油絵の具とキャンバスを理解する必要があり、...

高品質なJavaScriptコードの書き方

目次1. 読みやすいコード1. 統一コード形式2. マジックナンバーを削除する3. 単一機能原則2....

Linux での MySQL の文字化け問題の解決方法

プロジェクトはサーバーと対話し、post を通じてサーバー側の jsp にアクセスし、jsp はサー...

CentOS7 で yum ソースをインストールし、コマンド rz と sz をアップロードおよびダウンロードする方法 (画像付き)

** CentOS7 で yum ソースをインストールし、rz および sz コマンドをアップロー...

MySQLテーブル内の重複データをクエリする方法

hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...

Vue3 がコンポーネント通信に mitt を使用する手順

目次1. インストール2. プロジェクトにインポートしてマウントする3. 使用Vue2.x はコンポ...