MySQLインデックスに関する詳細を共有する

MySQLインデックスに関する詳細を共有する

数日前、同僚からMySQLのインデックスについて質問を受けました。大体わかっているのですが、まだ練習したいと思っています。is nullやis not nullなどのクエリにインデックスを使用できますか?インターネット上の記事ではインデックスは使用できないと書いてあるかもしれませんが、実際にはそうではありません。小さな実験を見てみましょう。

テーブル `null_index_t` を作成します (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 `null_key` varchar(255) デフォルト NULL,
 `null_key1` varchar(255) デフォルト NULL,
 `null_key2` varchar(255) デフォルト NULL,
 主キー (`id`)、
 キー `idx_1` (`null_key`) BTREE 使用、
 キー `idx_2` (`null_key1`) BTREE 使用、
 キー `idx_3` (`null_key2`) BTREE 使用
)ENGINE=InnoDB デフォルト文字セット=utf8mb4;

ストアドプロシージャを使用してデータを挿入する

区切り文字 $ # 区切り文字を使用してストアド プロシージャの終了をマークします。$ はストアド プロシージャの終了を示します。create procedure nullIndex1()
始める
iをintとして宣言します。	
j int を宣言します。	
i=1 に設定します。
j=1 に設定します。
i<=100の間、	
	while(j<=100) 実行する	
		(i % 3 = 0) ならば
	   null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (null 、 LEFT(MD5(RAND()), 8), LEFT(MD5(RAND()), 8) ) に INSERT します。
  そうでなければ (i % 3 = 1)
			 null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (LEFT(MD5(RAND()), 8), NULL, LEFT(MD5(RAND()), 8)); に挿入します。
	 それ以外
			 null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (LEFT(MD5(RAND()), 8), LEFT(MD5(RAND()), 8), NULL) に挿入します。
  終了の場合;
		j=j+1 と設定します。
	終了しながら;
	i=i+1 と設定します。
	j=1 に設定します。	
終了しながら;
終わり 
$
nullIndex1() を呼び出します。

次に、is nullクエリを見てみましょう

EXPLAIN select * from null_index_t WHERE null_key が null の場合; 

別のものを見てみましょう

EXPLAIN select * from null_index_t WHERE null_key が null ではない;

ここから何が見えるでしょうか?考えてみましょう。

上記から、is null はインデックス付けする必要があることがわかります。したがって、少なくともこれは包括的なルールではありません。ただし、is not null は機能しないようです。小さな変更を加えて、このテーブルのデータの 9100 を null にし、残りの 900 に値を持たせて、次のコマンドを実行してみましょう。

それでは実行結果を見てみましょう

EXPLAIN select * from null_index_t WHERE null_key が null の場合;

EXPLAIN select * from null_index_t WHERE null_key が null ではない; 

違うのでしょうか?ここで付け加えておきたいのは、実験に使用したMySQLは5.7であり、他のバージョンとの整合性は保証されていないということです。
実際、データの量が変化すると、MySQL がインデックスを使用するかどうかが変化することがわかります。これは、is not null が必ず使用されるという意味でも、絶対に使用されないという意味でもありません。代わりに、オプティマイザはクエリ コストに基づいて予測を行います。この予測により、主にテーブル戻り値を含むクエリ コストが可能な限り削減されますが、完全に正確であるとは限りません。

上記は、MySQL インデックスに関する詳細を共有する詳細な内容です。MySQL インデックスの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLインデックスを最適化する方法
  • MySql 範囲内の検索時にインデックスが有効にならない理由の分析
  • MySql インデックスを表示および最適化する方法
  • MySQL全文インデックスの原理と欠点
  • MySQL 5.6 の「暗黙的な変換」によりインデックスが失敗し、データが不正確になる
  • MySQL 8.0 のインデックス スキップ スキャン
  • MySQL のユニークインデックスと通常のインデックスのどちらを選択すればよいでしょうか?
  • Explainキーワードに基づいてMySQLインデックス機能を最適化する方法

<<:  Q&A: XML と HTML の違い

>>:  vue3 キャッシュページキープアライブと統合ルーティング処理の詳細な説明

推薦する

CSS 画像アニメーション効果のサンプルコード(フォトフレーム)

この記事では、CSS 画像アニメーション効果(フォトフレーム)のサンプルコードを紹介し、皆さんと共有...

MySQL 5.7.18 バージョンの無料インストール構成チュートリアル

MySQLはインストール版と無料インストール版に分かれていますインストール版の拡張子はmsi、無料イ...

KVM 仮想化のインストール、展開、管理のチュートリアル

目次1.kvmの展開1.1 kvmのインストール1.2 kvm Web管理インターフェースのインスト...

Dapr を使用してマイクロサービスをゼロから簡素化する例

目次序文1. Dockerをインストールする2. Dapr CLIをインストールする3. Net6 ...

HTML メタタグの一般的な使用例のコレクション

マタタグとは<meta> 要素は、検索エンジン向けの説明やキーワード、更新頻度など、ペー...

CSS3は小さな矢印のさまざまなグラフィック効果を実現します

CSS を使ってさまざまなグラフィックを実現できるのは素晴らしいことです。画像を切り取る必要はなく、...

Vueは右上隅の時間表示のリアルタイム更新を実装します

この記事の例では、右上隅の時間表示のリアルタイム更新を実現するためのVueの具体的なコードを紹介しま...

MySQLイベント計画タスクに関する簡単な説明

1. イベントが有効になっているかどうかを確認する'%sche%' のような変数を表...

Centos7 に MySQL 8.0.23 をインストールする手順 (初心者レベル)

まず、MySQL とは何かを簡単に紹介します。簡単に言えば、データベースはデータを格納するための倉庫...

自動ヘルスレポートを実現するDocker+Selenium方式

この記事では、ある大学の健康報告システムを例に、Web 側の自動化操作を完成させます。使用したテクノ...

js を使用して画像をモザイク化する方法の例

この記事では、主に js を使用して画像をモザイク化する方法の例を紹介し、次のように共有します。効果...

CSS の Flex レイアウトを使用してシンプルな縦棒グラフを作成する方法

以下は、Flex レイアウトを使用した棒グラフです。 HTML: <div class=&qu...

Linux gccコマンドの具体的な使い方

01. コマンドの概要gcc コマンドは、GNU がリリースした C/C++ ベースのコンパイラを使...

CentOS7にNginxを素早くインストールする方法を教えます

目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...

更新とデータ整合性処理のためのMySQLトランザクション選択の説明

MySQL のトランザクションはデフォルトで自動的にコミットされます (autocommit = 1...