MySQLインデックスが失敗するいくつかの状況の詳細な分析

MySQLインデックスが失敗するいくつかの状況の詳細な分析

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

コード値が「AAA」、「AAB」、「BAA」、「BAB」の列がある場合、「%AB」のようなコードが真となる条件であれば、

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

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

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

2. 複合インデックスの場合、インデックスの順序どおりに検索しない場合、たとえば、3 番目の位置のインデックスを直接使用し、1 番目と 2 番目の位置のインデックスを無視すると、完全なテーブルクエリが実行されます。

インデックスはc1、c2、c3、c4です

上図の結果は、c3 を直接使用すると完全なテーブルクエリになり、インデックスを使用できないことを示しています。したがって、c3 フィールドにインデックスを使用する前提は、c1 フィールドと c2 フィールドの両方でインデックスが使用されていることです。

3. 条件に「または」が含まれている

where 句で条件を接続するために または を使用することは避けてください。そうしないと、エンジンはインデックスの使用を中止し、次のようにテーブル全体のスキャンを実行します。

num=10 または num=20 の t から id を選択

次のようにクエリを実行できます。

num=10 の場合、t から id を選択 すべて結合 num=20 の場合、t から id を選択

4. インデックスはヌル値を保存できないため、where条件でフィールドに対してヌル値判定が行われた場合には、データベースはインデックスを破棄し、次のような完全なテーブルクエリを実行します。

num が null の t から id を選択

num にデフォルト値 0 を設定して、テーブルの num 列に null 値がないことを確認し、次のようにクエリを実行できます。

num=0 の t から id を選択

a. 単一列インデックスには null 値を格納することはできず、複合インデックスにはすべて null である値を格納することはできません。

b. is null 条件でクエリを実行する場合、インデックスは使用できず、テーブル全体のスキャンのみが可能です。

インデックス列に Null 値を格納できないのはなぜですか?

a. インデックスは順序付けられます。 NULL 値がインデックスに入ると、どこに配置されるかを判断する方法はありません。 (インデックス列の値のツリーを構築するには、必然的に多くの比較操作が必要になります。null 値は比較できない不確実な値であり、インデックス ツリーのリーフ ノードの位置に null が出現するかどうかを判別することはできません。)

5. where 句で != または <> 演算子を使用しないようにしてください。そうしないと、エンジンはインデックスの使用を中止し、テーブル全体のスキャンを実行します。

6. in と not in も注意して使用する必要があります。そうしないと、次のようにテーブル全体のスキャンが発生します。

t から id を選択、num は(1,2,3)

連続値の場合は、in の代わりに between を使用します。

num が 1 から 3 の間の t から id を選択

7. where 句内のフィールドに対して関数操作を実行しないようにしてください。そうしないと、エンジンがインデックスの使用を中止し、テーブル全体のスキャンを実行することになります。のように:

–id 名前がabcで始まる

t から id を選択し、substring(name,1,3)='abc' となる

8. where 句内のフィールドに対する式操作は避けてください。これにより、エンジンはインデックスの使用を中止し、テーブル全体のスキャンを実行します。のように:

num/2=100 となる t から id を選択

次のように変更する必要があります:

num=100*2 の t から id を選択

要約する

これで、MySQL インデックスが失敗するいくつかの状況に関するこの記事は終了です。MySQL インデックスの失敗の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  Dockerでudpポート番号を指定する問題を解決する

>>:  写真のプレビューとアップロード機能を実現するhtml+css+js

推薦する

sqlとmysqlの違いは何ですか?

SQL とは何ですか? SQL はデータベースを操作するために使用される言語です。 SQL はすべ...

5分でWebRTCビデオチャットを構築する

前回の記事では、Ubuntu 上の webrtc ベースの多人数ビデオチャット サービスの詳細なコー...

ウェブサイトを高速化する

パフォーマンスは本当に重要ですか?パフォーマンスは重要であり、誰もがそれを知っています。なぜ私たちは...

Linux デバイス用ネットワーク ドライバーの紹介

有線ネットワーク: イーサネット 無線ネットワーク: 4G、WiFi、Bluetooth、5G 概要...

Linux mpstat コマンドの使用方法の詳細な説明

1. mpstatコマンド1.1 コマンド形式 mpstat [ -A ] [ -u ] [ -V ...

3つの主要データベース(Mysql、SqlServer、Oracle)の違いについて簡単に説明します。

マイグレーションアドバンテージ:小型、高速、総所有コストが低い、オープンソース。複数のオペレーティン...

MySQL における悲観的ロックと楽観的ロック

リレーショナル データベースでは、悲観的ロックと楽観的ロックがリソース同時実行シナリオのソリューショ...

VueにおけるAxios非同期通信の詳細な説明

1. まず、インタラクティブに使用するための .json ファイルを作成します。json データ形式...

MySQL でパーティション分割後にクエリを実装するために MRG_MyISAM (MERGE) を使用する例

大量のデータベース データを最適化することは非常に高度な科学であり、開発者が習得する必要がある専門的...

JavaScript で Webpack を使用するチュートリアル

目次0. Webpackとは1. Webpackの使用2. Webpackのコアコンセプト2.1 エ...

よく使われるJavaScript配列メソッド

目次1. フィルター() 2. 各() 3. いくつか() 4. すべて() 5. 減らす() 6....

角度コンテンツ投影の詳細な説明

目次単一コンテンツ投影マルチコンテンツ投影単一条件のコンテンツ投影アプリ-人物-htmlアプリ担当者...

スクリプトを使用して、ワンクリックでDockerイメージをパッケージ化してアップロードします。

著者は1年以上マイクロフロントエンドプロジェクトに取り組んできました。チームは10個のマイクロアプリ...

JS+Canvas が抽選ホイールを引く

この記事では、宝くじターンテーブルを描画するJS + Canvasの具体的なコードを参考までに共有し...

Pure CSS3はdivの出入りを順番に実現します

この記事は主に、純粋な CSS3 を使用して div が順番に出入りする効果を紹介します。一定の参考...