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 キャッシュページキープアライブと統合ルーティング処理の詳細な説明

推薦する

Vue ファースト スクリーン パフォーマンス最適化コンポーネントの知識ポイントの概要

Vue ファースト スクリーン パフォーマンス最適化コンポーネントVue ファースト スクリーン パ...

Vue の img の src 画像アドレスの動的スプライシングの問題について

Vue での img の動的スプライシングを見てみましょう。src 画像アドレス、具体的な内容は次の...

calc() で全画面背景の固定幅コンテンツを実現

ここ数年、Web デザインには「全幅背景と固定幅コンテンツ」というトレンドが生まれています。このデザ...

Bootstrap5 ブレークポイントとコンテナの具体的な使用法

目次1. Bootstrap5 ブレークポイント1.1 モバイルファースト1.2 ブートストラップブ...

CSS3 フレックスレイアウトを使用して要素を均等に分散するサンプルコード

この記事では主に、CSS3 フレックスレイアウトを使用して要素を均等に配置する方法を紹介します。自分...

Docker が elasticsearch を起動するときのメモリ不足の問題と解決策

質問Docker が elasticsearch をインストールして起動するときにメモリが不足するシ...

スライド階段効果を実現するjQuery

この記事では、階段スライド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具...

HTML5+CSS3 ヘッダー作成例と更新

前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考...

期間限定フラッシュセール機能を実装するJavaScript

この記事では、期間限定フラッシュセール機能を実装するためのJavaScriptの具体的なコードを参考...

Linux で Spring Boot プロジェクトを開始および停止するためのスクリプトの例

Springboot プロジェクトを開始するには、次の 3 つの方法があります。 1. メインメソッ...

MySQL スロークエリログの基本的な使い方チュートリアル

スロークエリログ関連のパラメータMySQL スロー クエリ関連のパラメータの説明: slow_que...

XHTML 1.0 リファレンス

機能別に並べ替えNN: このタグをサポートする Netscape の以前のバージョンを示しますIE:...

MySQL 起動エラー InnoDB: ロックできません/ibdata1 エラー

OS X 環境で MySQL を起動すると、エラー メッセージが表示されます。 016-03-03T...

MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL では、テーブル名の大文字と小文字の区別の問題が発生する可能性があります。実際、これはプラ...

jsのディープコピーを理解しましょう

目次js ディープコピーデータ保存方法浅いコピー/深いコピーとは何か一般的なディープコピーの実装1....