MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法

MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法

% ワイルドカードを使用すると、インデックス失敗の問題が発生することがよくあります。
ここでは、like が % を使用するいくつかのケースについて説明します。

次の例では、インデックス (VC_STUDENT_NAME) を使用します。

1. 「xx%」にいいね

EXPLAIN select * from t_student where VC_STUDENT_NAME like '王%' 

ここに画像の説明を挿入

%が先頭に配置されていない場合、インデックスは有効であることがわかりました。

2. '%xx' にいいね

EXPLAIN select * from t_student where VC_STUDENT_NAME like '%王' 

ここに画像の説明を挿入

% を先頭に置くとインデックスが無効になることがわかりました。

上記の 2 つの例は、ワイルドカードを使用する場合、先頭に % を置くとインデックスが失敗することを示しています。
しかし、実際の問題では、あいまい一致のために先頭に % を置く必要があることがよくあります。インデックス障害の問題は、インデックスをカバーすること、つまりインデックスカバーリングクエリによって解決できます。

EXPLAIN select * from t_student where VC_STUDENT_NAME like '%王'


ここに画像の説明を挿入

クエリ列をインデックスに対応する列に置き換えることで、インデックス無効化の問題を解決できます。

補充:

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

より正確に言うと、単一列インデックスには null 値は格納されず、複合インデックスにはすべて null の値は格納されません。インデックスは Null を格納できないため、この列に 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」のようなコードが真となる条件であれば、

あいまいなので、インデックスの順序は使用できません。条件が満たされているかどうかを確認するには、1 つずつ検索する必要があります。これにより、完全なインデックススキャンまたは完全なテーブルスキャンが実行されます。

説明。条件が「A % 」のようなコードである場合、コード内でAで始まるコードの位置を検索し、Bで始まるコードに遭遇すると、

データがない場合、後続のデータは確実に要件を満たさないため、検索を停止できます。この方法でインデックスを活用できます。

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

1. 条件に or がある場合、条件にインデックスがあっても or は使用されません (これが、 or ができるだけ使用されないようにする理由です)

またはを使用してインデックスを有効にする場合は、または条件内の各列にのみインデックスを追加できます。

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

3.クエリが%で始まる

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

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

5.MySQLは主にBツリーインデックスとハッシュインデックスの2種類のインデックスを提供します。

B ツリー インデックスには、範囲検索とプレフィックス検索を実行する機能があります。N 個のノードを持つ B ツリーの場合、レコードを取得する複雑さは O(LogN) です。バイナリ検索と同等です。

ハッシュインデックスは等価検索にのみ使用できますが、ハッシュテーブルがどれだけ大きくても、検索の複雑さは O(1) です。

明らかに、値が大きく異なり、主な検索が等しい値(=、<、>、in)である場合、ハッシュインデックスは検索の複雑さが O(1) であるため、より効率的な選択肢となります。

値間の差が比較的小さく、範囲検索が主な焦点である場合は、範囲検索をサポートしている B ツリーの方が適しています。

これで、MySQL ファジー クエリ インデックスの失敗の問題を解決するためのいくつかの方法についてのこの記事は終了です。MySQL ファジー クエリ インデックスの失敗に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データベースのインデックスと障害シナリオの詳細な説明
  • MySQL のインデックス障害の一般的なシナリオと回避方法
  • MySQL インデックス失敗の原理
  • MySQL のインデックス有効条件とインデックス無効条件の結合
  • MySQL インデックスが失敗する 15 のシナリオを共有する

<<:  優れた登録プロセスの手順

>>:  WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

推薦する

HTML CSS に基づく検索アイコン付き検索ボックス機能を実装する

序文フロントエンドで非常に便利な、小さなアイコン付きの検索ボックスを作成する方法をご紹介します。エフ...

ローカル yum ソースの設定、国内 yum ソースの設定、epel ソースの設定を行う Linux の手順

1. ローカルyumソースを設定する1. ISOイメージをマウントする マウント -o loop /...

VueはWebSocketを使用してチャット機能をシミュレートします

この効果は、2つのブラウザが互いにシミュレートしていることを示しています 1. シミュレートされたノ...

MySQL 8.0.11 Community Green Edition の Windows 用インストール手順図

このチュートリアルでは、インストールに最新の MySQL コミュニティ グリーン バージョンである ...

win10 mysql 5.6.35 winx64 無料インストールバージョン設定チュートリアル

mysql 5.6.35 winx64無料インストールバージョン構成チュートリアルwin10、具体的...

Linux で一般的なソフトウェアを設定する方法

新しいLinuxサーバーを入手する場合、通常は次の5つの構成を実行する必要があります。 HOSTAN...

Linux Centos8 CA証明書作成チュートリアル

必要なファイルをインストールする Yum インストール openssl-* -yデータベースインデッ...

フレームウィンドウ間の関連付けとハイパーリンクのターゲット属性の使用を実装する方法

フレーム ウィンドウの関連付けを実現するには、次に示すように、ハイパーリンクの「ターゲット」ウィンド...

Node.jsをゼロから学ぶ

目次URL モジュール1. 解析メソッド2. フォーマット方法3. 解決方法イベントモジュール(イベ...

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

この記事では、MySQL 8.0.20 winx64 のインストールと設定方法を次のように説明します...

Ubuntu での mysql のインストールと使用 (一般版)

Ubuntu のバージョンに関係なく、MySQL データベースのインストールは基本的に同じです。具...

特定の MySQL テーブルの完全データと増分データをメッセージ キューに同期する - ソリューション

目次1. 当初の需要2. 解決策3. 運河の導入と設置運河の仕組み建築インストール4. 検証1. 当...

ウェブのさまざまなフロントエンド印刷方法: CSS はウェブページの印刷スタイルを制御します

CSS は Web ページの印刷スタイルを制御します。 CSS を使用して印刷スタイルを制御します。...

数十行のjsを使用してクールなキャンバスインタラクティブ効果を実現する方法を教えます

目次1. 円を描く2. マウスで動かした円3. マウスでドラッグした粒子4. カラーグラデーション粒...

Dockerコンテナを停止および削除できない問題の解決策

実行中のコンテナIDを見つける ドッカーps上記のコンテナの物理的な場所を見つける /var/lib...