MySQL の結合インデックスと左端一致原則の詳細な説明

MySQL の結合インデックスと左端一致原則の詳細な説明

序文

これまでインターネットでMySQLジョイントインデックスの最左接頭辞マッチングに関する記事をたくさん見てきましたが、その原理は理解しているつもりでした。最近、面接中に面接官とやりとりしているときに、いくつか見逃していたことが分かりました。ここではこの点について内容を整理します。

複合インデックスはいつ作成すればよいですか?

whereクエリに複数の条件クエリがある場合、クエリ列の複合インデックスを作成する必要があります。

すべての列にインデックスを作成しないのはなぜですか?

  • 経費を削減
  • カバーインデックス
  • 高効率

オーバーヘッドの削減: col1、col2、col3 の複合インデックスを作成すると、(col1)、(col1、col2)、(col1、col2、col3) の 3 つのインデックスを作成するのと同じになります。カバー インデックス: SELECT col1、col2、col3 FROM テーブル名をクエリすると、クエリ対象のフィールドがインデックス ページに存在するため、クエリのためにテーブルに戻らなくても、インデックスから直接取得できます。

高効率: col1、col2、col3 にそれぞれインデックスを作成します。MySQL は、最も認識度の高い列のみをインデックスとして選択します。 100 万のデータがあり、インデックスがデータの 10% をフィルターすると仮定すると、1,000 万のデータをフィルターできます。結合インデックスの場合は、100 万 * 10% * 10% * 10% = 1,000 のデータをフィルターできます。

左端一致原則

(col1、col2、col3) の複合インデックスを作成するとします。これは、col1 列をソートするのと同じです。つまり、左端の列に基づいて複合インデックスを作成します。クエリ条件に左端の列が含まれている限り、クエリはインデックスを使用します。

テストテーブルを作成する

テーブル「学生」を作成(
 `id` int(11) NULLではない、
 `name` varchar(10) NOT NULL,
 `age` int(11) NOT NULL,
 主キー (`id`)、
 キー `idx_id_name_age` (`id`,`name`,`age`)
) エンジン=InnoDB デフォルト文字セット=utf8

100万のテストデータを入力する

ドロップ手順 pro10;
プロシージャ pro10() を作成する
始める
	i INT を宣言します。
	char_str varchar(100) を DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' として宣言します。
	return_str varchar(255) DEFAULT '' を宣言します。
	age INT を宣言します。
	i = 1 に設定します。
	私は5000000未満ですが
		return_str = substring(char_str, FLOOR(1 + RAND()*62), 8 を設定します。
		i = i+1 を設定します。
		年齢 = FLOOR(RAND() * 100) を設定します。
		学生にINSERT INTO(ID, 名前, 年齢) values(i, return_str, 年齢);
	終了しながら;
終わり;

pro10() を呼び出します。

シナリオテスト

EXPLAIN SELECT * FROM student WHERE id = 2;

クエリがインデックスを使用していることがわかります

EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk';

クエリがインデックスを使用していることがわかります

EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8;

クエリがインデックスを使用していることがわかります

EXPLAIN SELECT * FROM student WHERE id = 2 AND age = 8;

クエリがインデックスを使用していることがわかります

EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND age = 8;

クエリはインデックスを使用しておらず、タイプはインデックス、クエリ行数は 4989449 で、ほぼテーブル全体がスキャンされていることがわかります。結合されたインデックスは左端の列のみをソートするため、名前と年齢のみを完全にスキャンできます。

EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND id = 2;

EXPLAIN SELECT * FROM student WHERE age = 8 AND id = 2;

EXPLAIN SELECT * FROM student WHERE name = 'defghijk' and age = 8 AND id = 2;

上記のクエリでもインデックスが使用されていることがわかります。ID を先頭または末尾に配置した場合の結果は同じです。MySQL は、最初に ID に基づいてクエリを実行する最も効率的なクエリ方法を見つけます。

要約する

上記のテストに示されているように、クエリ条件内の列に複合インデックスの左端の列が含まれている限り、クエリ条件内の列の位置に関係なく、インデックスがクエリに使用されます。

さて、今回の記事は以上です。この記事の内容が皆さんの勉強や仕事に少しでも参考になれば幸いです。123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLジョイントインデックスの左端一致原則の詳細な分析
  • MySQLのインデックス設計の原則と一般的なインデックスの違いについて簡単に説明します。
  • MySQLインデックスを追加する3つの原則を簡単に理解する
  • MySQL インデックスの左端原則のサンプルコード
  • 1 つの記事で MySQL インデックス作成の原則を理解する

<<:  擬似分散グラフィックを実現するための VMware 構成 Hadoop チュートリアル

>>:  Vuexの補助関数の使い方

推薦する

Vue3.0 エラーの解決策: モジュール 'worker_threads' が見つかりません

vue3.0 への最初の試みを記録します。プロジェクトを開始したときに、「モジュール 'wo...

MySQL テーブル自動増分 ID オーバーフロー障害レビュー ソリューション

問題: MySQLテーブル内の自動増分IDのオーバーフローによりビジネスブロックが発生した背景: t...

nacos が mysql に接続できない場合の解決策

理由nacos の pom が依存する mysql バージョンが、mysql バージョンと一致してい...

Linux での fuser コマンドの使用法の詳細な説明

説明する: fuser は、現在ディスク上のファイル、マウント ポイント、さらにはネットワーク ポー...

ショッピングカートの計算を実現する js メソッド

この記事の例では、ショッピングカートの計算を実装するためのjsの具体的なコードを参考までに共有してい...

React Fiberの仕組みの詳細な説明

目次React Fiberとは何ですか?なぜReact Fiberなのか? React Fiberは...

Docker で複数のアプリケーション サイトをプロキシするために Nginx を使用する方法

序文エージェントの役割は何ですか? - 複数のドメイン名が同じサーバーに解決される- 1つのサーバー...

Linux sftp コマンドの使用法の概要

sftp は、安全なファイル転送プロトコルである Secure File Transfer Prot...

MySQL での IN データボリュームの使用の最適化された記録

MySQL のバージョン番号は 5.7.28 です。テーブル A には 390 万件のレコードがあり...

一般的なテーブルコンポーネントの Vue カプセル化の完全な手順記録

目次序文テーブル コンポーネントをカプセル化する必要があるのはなぜですか?ステップ1: 共通コンポー...

HTML でのテキストエリアの使用と一般的な問題およびケース分析

textarea タグはよく使われる HTML タグです。主に長いテキストを入力するときに改行するた...

EF (Entity Framework) の挿入または更新データ エラーの解決方法

エラー メッセージ:ストアの更新、挿入、または削除ステートメントが予期しない行数 (0) に影響を与...

CSSラベル表示モードについて1つの記事で学ぶ

タグの種類(表示モード) HTML タグは、一般的にブロック タグとインライン タグの 2 種類に分...

Vue の一般的な問題と解決策の概要 (推奨)

Vue に限定されず、他の種類の SPA プロジェクトにも当てはまる問題がいくつかあります。 1....

MySQL関数の簡単な紹介

目次1. 数学関数2. 文字列関数3. 日付関数4. 暗号化機能主な MySQL 関数は次のように紹...