MySQL インデックス カバレッジの例の分析

MySQL インデックス カバレッジの例の分析

この記事では、MySQL インデックス カバレッジについて例を挙げて説明します。ご参考までに、詳細は以下の通りです。

インデックスカバー

クエリ対象の列がインデックスの一部である場合、クエリはインデックス ファイルに対してのみ実行すればよく、データを見つけるためにディスクに戻る必要はありません。このタイプのクエリは非常に高速であり、「インデックス カバーリング」と呼ばれます。

t15テーブルがあり、そこに結合インデックスが作成されているとします: cp (cat_id, price)

這里寫圖片描述

次の SQL ステートメントを使用すると、インデックス カバレッジが発生します。信じられないなら、調べてみましょう。ここでの Extra には、Using index と表示されています。これは、この SQL ステートメントがインデックス カバレッジのみを使用していることを意味します。

這里寫圖片描述

cat_id = 1 の場合、t15 から価格を選択します。

質問を見てみましょう。電子メール列にインデックスが付いた t11 テーブルを作成します。

這里寫圖片描述

次のクエリを使用するとします。

t11 から eamil を選択します。right(email,4)='.com'

クエリ分析:

這里寫圖片描述

まずはExtraを見てみましょう。ここにUsing indexとありますが、これはインデックスカバレッジが使われていることを意味します。possible_keysがNULLになっているのは、MySQLの関数を使用しているため、クエリ中にメールインデックスが使われていないのですが、キーがメールなので、ソートにインデックスが使われていることを意味します。信じられない方は、データを印刷して見てください。

這里寫圖片描述

ここのデータはソートされています。元データはこんな感じです。

這里寫圖片描述

インデックスカバーの問題

テーブルAを作成(
id varchar(64) 主キー、
ver int、
…
)

テーブルには、idとverの結合インデックスを持つ、非常に長いフィールドvarbinary(3000)がいくつかあり、合計10,000レコードになります。

select id from A order by idなぜこんなに遅いのでしょうか?
そしてselect id from A order by id,ver非常に速いです

質問: id と (id,ver) はどちらもインデックスを持っており、select id は「インデックス カバレッジ」の効果を生み出すはずです。前者は遅く、後者は速いのはなぜですか?

アイデア: InnoDB クラスター化インデックスと MyISAM インデックスの違い、これら 2 つの観点からインデックス カバレッジを考慮する

(1) このテーブルが MyISAM インデックスを使用していると仮定すると、これら 2 つの SQL 文はどちらもデータを検索するために行を戻る必要がないため、速度は同様になるはずです。

(2)このテーブルがInnoDBインデックスを使用していると仮定すると、SQL文select id from A order by idは主キーインデックスを使用します。これは、InnoDBの各主キーが各行のデータを保持し、この問題には特に大きなフィールドがいくつかあるため、idの検索が比較的遅くなるためです。SQL文select id from A order by id,verはid、ver結合インデックスを使用します。InnoDBストレージエンジンでは、セカンダリインデックスに主キーインデックスのアプリケーションが格納されるため、セカンダリインデックスには行のデータは保持されません。この場合、(id、ver)インデックスでidを検索する方が高速になります。対応するノードツリーが見つかったら、主キーインデックスの場所を再度検索するだけで、行のデータを取得できます。これは高速です。

推測する:

(1)テーブルがMyISAMエンジンを使用している場合、2つのステートメントの速度に大きな違いはありません。
(2)クラスター化インデックスのため、InnoDBテーブルのIDインデックスはディスク上の複数のブロックにまたがる必要があり、速度が低下します。
(3)InnoDBエンジンであっても、長いvarbinay列がない場合、2つの文の速度に大きな差はありません。

テーブル t12 (ストレージ エンジン MyISAM) には、主キー インデックスと (id,ver) インデックス、およびいくつかの大きな可変長フィールドがあります。テスト推論 1

這里寫圖片描述

InnoDB ストレージ エンジンを備えたテーブル t13 には、主キー インデックスと (id,ver) インデックス、およびいくつかの大きな可変長フィールドがあります。

這里寫圖片描述

テーブル t14、ストレージ エンジンは InnoDB、主キー インデックスと (id,ver) インデックスがあり、大きな可変長フィールドはありません。 補論 3

這里寫圖片描述

t12、t13、t14 の各テーブルには 10,000 個のデータが含まれており、テストが実行されます。テスト結果は次のようになり、推論は正しいです。

這里寫圖片描述

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • インデックスとテーブルリターンをカバーするMySQLの使い方
  • MySQLはカバーインデックスを使用してテーブルリターンを回避し、クエリを最適化します。
  • MySQL テーブルを返すとインデックスが無効になるケースの説明
  • MySQL のテーブルリターンとインデックスカバレッジの例の詳細な説明

<<:  zabbix 4.04 の詳細なインストール チュートリアル (CentOS 7.6 ベース)

>>:  WeChatアプレットがシンプルな計算機機能を実装

推薦する

リストループスクロールを実現するための HTML+CSS+JavaScript サンプルコード

説明: 指定された時間内に前のノードのコンテンツを置き換えるタイマーを設定します。 1. キーコード...

Nginx サービス クイック スタート チュートリアル

目次1. Nginx の紹介1. Nginx とは何ですか? 2. Nginx を使用する理由3. ...

MySQL 変数の原理と応用例

MySQL ドキュメントでは、MySQL 変数はシステム変数とユーザー変数の 2 つのカテゴリに分類...

MySQL テーブル分割後にスムーズにオンラインになる方法

目次テーブルの目的例えばテーブル分割戦略すでにオンラインになっている実行中のテーブルはどうすればよい...

Vue プロジェクトで axios リクエストを使用する方法

目次1. インストール2. カプセル化に問題はない3. ファイルを作成する4. アドレス設定をリクエ...

CSS ピクセルとさまざまなモバイル画面適応の問題に対する解決策

ピクセル解決通常、モニター解像度と呼ばれるものは、実際にはモニターの物理的な解像度ではなく、デスクト...

mysql5.7.22 ダウンロードプロセス図

1. 公式ウェブサイト www.mysql.com にアクセスし、ダウンロードを選択します。 2. ...

Nginx リバース プロキシでセッション永続性を実装する 2 つの方法の詳細な説明

1. ip_hash: ip_hash は、送信元アドレス ハッシュ アルゴリズムを使用して、サーバ...

IE8でラベルの背景画像が表示されない問題の解決方法

今日、ちょっとした問題に遭遇し、長い間苦労しました。そのことを皆さんにシェアしたいと思います。 a ...

Vue.jsのレンダリング関数の使い方の詳しい説明

Vue では、ほとんどの場合、テンプレートを使用して HTML を作成することを推奨しています。ただ...

負の距離(共感) - 相互影響の反復プロセス

ネガティブな距離は共感を意味します。序文(疑問の提起):プロダクトマネージャーは機能を把握します。機...

JavaScript でアルゴリズムの複雑さを学ぶ方法

目次概要Big O 表記法とは何ですか?オー(1)の上) (n^2) O(logn) ですの上!)結...

WeChat アプレット wxss で外部 CSS ファイルとアイコンフォントを参照する方法

原因外部ファイルをミニプログラムにインポートする方法は次のとおりです: @import "...

Vue で Graphql インターフェースを実装する例

注意:この記事は現在取り組んでいる nestjs+graphql+serverless 合宿における...

Vue + 要素を使用して背景データをオプションに動的に表示する

必要:ハードコードされたデータの代わりに、セレクター内のオプション値の動的な表示を実装します。私のロ...