MySQL インデックスが失敗するいくつかの状況の概要

MySQL インデックスが失敗するいくつかの状況の概要

1. インデックスはnull値を保存しない

より正確に言うと、単一列インデックスには null 値は格納されず、複合インデックスにはすべて null の値は格納されません。インデックスには Null 値を格納できません。したがって、この列に is null 条件を使用すると、インデックスに Null 値がないためインデックスを使用できず、テーブル全体をスキャンすることしかできなくなります。
インデックス列に Null 値を格納できないのはなぜですか?
インデックス列の値のツリーを構築するには、必然的に多くの比較操作が必要になります。 Null 値の特別な特徴は、関係するほとんどの操作が null 値を取ることです。
この場合、null 値は実際にはインデックス作成プロセスに参加できません。つまり、null 値は他の値のようにインデックス ツリーのリーフ ノードには表示されません。

2. キー値が少ない列(重複データが多い列)には適していません

インデックス列 TYPE に 5 つのキー値があり、レコードが 10,000 件ある場合、WHERE TYPE = 1 はテーブル内の 2,000 個のデータ ブロックにアクセスします。
インデックス ブロックへのアクセスに加えて、合計 200 を超えるデータ ブロックにアクセスする必要があります。
テーブル全体をスキャンする場合、1 つのデータ ブロックに 10 個のデータ項目があると仮定すると、アクセスする必要があるデータ ブロックは 1,000 個だけです。テーブル全体のスキャンではアクセスするデータ ブロックが少なくなるため、インデックスは確実に使用されません。

3. 先頭のあいまいクエリではインデックスを使用できません (「%XX」や「%XX%」など)

'AAA'、'AAB'、'BAA'、'BAB' という値を持つコードの列があり、'%AB' のようなコードが入る条件があった場合、前の条件が曖昧なので、インデックスの順序は使えず、値を一つずつ検索して条件に合っているかどうかを調べる必要があります。これにより、完全なインデックス スキャンまたは完全なテーブル スキャンが実行されます。条件が「A % 」のようなコードである場合、CODE 内の A で始まる CODE の位置を検索できます。B で始まるデータに遭遇すると、後続のデータは確実に要件を満たさないため、検索を停止できます。この方法でインデックスを活用できます。

4. インデックス障害が発生するいくつかの状況

1. 条件に or がある場合、条件にインデックスがあっても or は使用されません (これが、 or ができるだけ使用されないようにする理由です)
またはを使用してインデックスを有効にする場合は、または条件内の各列にのみインデックスを追加できます。

nid = 1 または name = '[email protected]' の場合、tb1 から * を選択します。
 
 
 --特殊: or 条件は、インデックスが作成されていない列がある場合にのみ無効になります。次の例では、インデックス select * from tb1 where nid = 1 or name = 'seven' を使用します。
   nid = 1 または name = '[email protected]' かつ email = 'alex' の場合、tb1 から * を選択します。

2. 複数列インデックスの場合、インデックスは最初に使用される部分でない限り使用されません。

3.クエリが%で始まる

tb1 から * を選択します。メールアドレスは '%cn' のようなものになります。

4. 列の型が文字列の場合、条件内でデータを引用符で囲む必要があります。そうしないと、インデックスは使用されません。

tb1 から email = 999 の * を選択します。

5. MySQL は、テーブル全体のスキャンの方がインデックスよりも高速であると判断すると、インデックスを使用しません。

6. 通常のインデックスはインデックスがないことを意味するものではない

- !=
 tb1 から * を選択します。メールアドレスが != 'alex' の場合
 
 --特別: 主キーの場合、インデックスは引き続き使用されます。select * from tb1 where nid != 123
->
 tb1 から * を選択し、メール > 'alex' を選択します。
 
 
 --特別: 主キーまたはインデックスが整数型の場合、インデックスは引き続き使用されます。select * from tb1 where nid > 123
  tb1 から * を選択 (num > 123)

7. 複合インデックスの左端のプレフィックス

結合されたインデックスが次の場合: (名前、メール)

名前とメールアドレス - インデックスを使用
名前 -- インデックスを使用する
電子メール -- インデックスを使用しない

上記は、MySQL インデックスが失敗するいくつかの状況の詳細な概要です。MySQL インデックスの失敗の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Mysql インデックスが失敗するいくつかの状況の分析
  • MySQL のインデックス障害の一般的なシナリオと回避方法
  • MySQL でデータベース インデックスが失敗する状況の詳細な分析
  • mysql はインデックスを無効にしますか?
  • MySQL インデックス障害の 5 つの状況の分析
  • MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法
  • MySQL インデックスの失敗を引き起こす一般的な書き込み方法の概要
  • MySQLインデックスが失敗するいくつかの状況の詳細な分析
  • MySQLインデックスが失敗するいくつかの状況の分析
  • MySQL データベースのインデックスと障害シナリオの詳細な説明

<<:  Idea で Docker を使用して SpringBoot プロジェクトをデプロイする詳細な手順

>>:  jsは、州、市、地区の3レベルのリンクの非選択ドロップダウンボックスバージョンを実現します。

推薦する

CSS 擬似要素::マーカーの詳細な説明

この記事では、CSS ::markerの興味深い疑似要素を紹介します。これを使用すると、テキスト番号...

MySQL 学習 (VII): Innodb ストレージ エンジン インデックスの実装原理の詳細説明

概要データベースでは、ツリー ディレクトリと同様に、インデックスを使用してデータ検索を高速化します。...

CSS スタイルを使用して表のフォントを垂直中央に配置する方法

CSS スタイルを使用して表内のフォントを垂直方向に中央揃えする方法は次のとおりです。下図のようなカ...

MySQL OOM (メモリオーバーフロー) の解決策

OOM は「Out Of Memory」の略で、メモリオーバーフローを意味します。メモリ オーバーフ...

MySQL に 1,000 万件のレコードを素早く挿入する方法

面接で「MySQL に 1,000 万件のレコードをすばやく挿入するにはどうすればよいか」という質問...

MySQL 8.0.15 winx64 解凍版のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15 winx64解凍版のインストールと設定方法を紹介します。具体...

ES6 配列のコピーおよびフィルメソッド copyWithin() および fill() の具体的な使用法

目次バッチコピー copyWithin()配列を埋めるメソッド fill()指数の計算方法については...

ブラウザのスクロールバーのスタイルを変更するための純粋な CSS の例

CSSを使用してブラウザのスクロールバーのスタイルを変更する ::-webkit-スクロールバー{ ...

テーブルレイアウトの長所と短所、そして推奨されない理由

テーブルの欠点1. テーブルは他の HTML タグよりも多くのバイトを占有します。 (ダウンロード時...

固定、流動的、柔軟なウェブページレイアウトの長所と短所の分析

ウェブデザイナーを長い間悩ませてきた疑問があります。それは、固定レイアウト、流動的レイアウト、柔軟レ...

XHTML でのハイパーリンク タグの使用に関するチュートリアル

ハイパーリンク。「リンク」とも呼ばれます。ハイパーリンクは、私たちが閲覧する Web ページのいたる...

MySQL: データの整合性

データ整合性は、エンティティ整合性、ドメイン整合性、参照整合性に分けられます。参照整合性:参照整合性...

JavaScript PromiseとAsync/Awaitの詳細な説明

目次概要4つの例例1: 誕生日で説明する約束の基本例2: 数字当てゲーム例3: Web APIから国...

Nest.js 認証検証方法の例

目次0x0 はじめに0x1 RBAC 実装0x2 クレームベースの承認0x3 統合 CASL 0x4...

一般的な docker コマンドの概要 (推奨)

1. 要約:一般的に、次のカテゴリに分類できます。 Docker 環境情報 — docker [i...