MySQLインデックスが使用されない状況のまとめ

MySQLインデックスが使用されない状況のまとめ

MySQL のインデックスの種類

一般的に、次の 4 つのカテゴリに分類できます。

  • 通常のインデックス: 最も一般的なインデックス
  • 一意のインデックス: インデックス列の値は一意である必要がありますが、null 値も許可されます。
  • 主キーインデックス: NULL値を許可しない特別な一意のインデックス
  • ジョイントインデックス: インデックス列には複数のフィールドがあり、使用時には左端のプレフィックス原則を満たす必要があります。

通常のインデックス

これは最も基本的なインデックスであり、制限はありません。以下の方法で作成できます。

1. インデックスを作成する

コードは次のとおりです。

mytable(username(length))にインデックスindexNameを作成します。

CHAR または VARCHAR 型の場合、長さはフィールドの実際の長さより短くてもかまいません。BLOB または TEXT 型の場合は、長さを指定する必要があります。以下でも同様です。

2. テーブル構造を変更する

コードは次のとおりです。

ALTER mytable ADD INDEX [indexName] ON (username(length))

テーブル作成時に直接指定する

テーブルmytableを作成します(
 ID INT NULLではありません、
 ユーザー名 VARCHAR(16) NOT NULL,
 INDEX [インデックス名] (ユーザー名(長さ))
);

インデックスを削除するための構文は次のとおりです。

mytable のインデックス [indexName] を削除します。

ユニークインデックス

これは、インデックス列の値が一意である必要があることを除いて、以前の通常のインデックスと似ていますが、null 値が許可されます。複合インデックスの場合、列の値の組み合わせは一意である必要があります。以下の方法で作成できます。

mytable(ユーザー名(長さ))に一意のインデックスindexNameを作成します。

テーブル構造を変更します。

ALTER mytable ADD UNIQUE [indexName] ON (username(length))

テーブルを作成するときは、直接指定します。

テーブルmytableを作成します(  
	ID INT NULLではありません、  
	ユーザー名 VARCHAR(16) NOT NULL,  
	一意の [indexName] (ユーザー名(長さ))  
);

主キーインデックス

これは、null 値を許可しない特別な一意のインデックスです。通常、主キー インデックスはテーブルの作成時に作成されます。

コードは次のとおりです。

テーブルmytableを作成します(  
	ID INT NULLではありません、  
	ユーザー名 VARCHAR(16) NOT NULL,  
	主キー(ID) 
);

もちろん、ALTER コマンドを使用することもできます。注意: テーブルには主キーを 1 つだけ設定できます。

共同インデックス

単一列インデックスと複合インデックスを視覚的に比較するには、テーブルに複数のフィールドを追加します。

テーブルmytableを作成します(  
	ID INT NULLではありません、  
	ユーザー名 VARCHAR(16) NOT NULL,  
	都市 VARCHAR(50) NOT NULL,  
	年齢 INT NOT NULL 
);

MySQL の効率をさらに高めるには、複合インデックスの作成を検討する必要があります。つまり、名前、都市、年齢を 1 つのインデックスに構築します。

コードは次のとおりです。

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);

インデックスが使用されない状況

インデックスは常に効果的であるとは限りません。正しく操作しないと、インデックスの代わりにテーブル全体のスキャンが実行される可能性があります。Explain の possible_key、key_len、および key パラメータを使用すると、SQL ステートメントでインデックスが使用されているかどうかを分析できます。

以下の状況ではインデックスが失敗します

  1. != はクエリ列で使用されます。たとえば、select id,name,age from student where id != 2; です。
  2. クエリ列で、ID を 2 乗する pow(id,2) などの関数演算が使用されている場合、インデックスは使用されません。
  3. 条件に or がある場合、条件の一部にインデックスがあっても使用されません (このため、 or はできるだけ使用しないでください)
  4. 結合インデックスで最左プレフィックスの原則が満たされている場合でも、最初の条件に範囲クエリが含まれている場合、インデックスは使用されません。
  5. インデックス列のデータ型が暗黙的に変換された場合、インデックスは使用されません。たとえば、列の型が文字列の場合、条件内でデータを引用符で囲む必要があります。そうしないと、インデックスは使用されません。
  6. MySQL は、インデックスを使用するよりもテーブル全体のスキャンの方が高速であると見積もった場合、インデックスを使用しません。

Explain を使用して、インデックスが使用されているかどうかをテストできます。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL インデックス使用状況監視スキル (収集する価値あり!)
  • 複合主キーと複数列インデックスに遭遇した場合の MySQL 行ロックの詳細な説明
  • インデックスは MySQL クエリ条件で使用されますか?
  • MySQL インデックスがソートに与える影響の分析例
  • MySQLアカウントのIP制限条件を変更する方法
  • MySQL パーティションテーブルの制限と制約の詳細な説明
  • MySQLクエリステートメントは、クエリされる行の数を制限するためにlimitを使用します。
  • MySQL接続数が制限を超える問題の解決方法
  • MySQL インデックスの長さ制限の原理の分析

<<:  WeChatアプレットがジグソーパズルゲームを実装

>>:  Ubuntu 18.04 (コミュニティ エディション) に Docker CE をインストールする方法

推薦する

Vue axios インターセプターは、繰り返しリクエストのキャンセルによく使用されます。

導入前回の記事では、axios のシンプルなカプセル化と、axios インターセプターの適用シナリオ...

JavaScriptはスタック構造の詳細なプロセスを実装する

目次1. スタック構造を理解する2. スタック構造のカプセル化3. 10進数を2進数に変換する1. ...

1つの記事でJavaScript DOM操作の基本を学ぶ

DOM の概念DOM: ドキュメント オブジェクト モデル: ドキュメント オブジェクト モデルは、...

MySQLは、統計クエリを最適化するために、sum、case、whenを巧みに使用します。

私は最近、会社で統計レポートの開発に関わるプロジェクトに取り組んでいました。データの量が比較的多かっ...

Linux ディスクのシーケンシャル書き込みとランダム書き込みの方法

1. はじめに● ランダム書き込みではヘッドがトラックを頻繁に変更するため、効率が大幅に低下します。...

HTML で複数のフォームのテキスト ボックスを揃える方法

フォームのコードは図の通りです。スタイルシートがまだ追加されていないため、フォームが整列されておらず...

パーティショニングを使用して数十億のデータに対する MySQL データ処理を最適化する方法

MySQL が数千万のデータをクエリする場合、ほとんどのクエリ最適化の問題はインデックスを通じて解決...

Linuxのpasswdコマンドの使用

1. コマンドの紹介passwd コマンドは、ユーザー パスワード、アカウント ロック、パスワードの...

MySQL で '%' を含むフィールドをクエリする方法の詳細な説明 (ESCAPE の使用法)

SQLのlike文では、例えば SELECT * FROM user WHERE username...

jQueryブリージングカルーセルの制作原理を詳しく解説

この記事では、jQueryブリージングカルーセル制作原理の具体的なプロセスを参考までに紹介します。具...

Linuxでmore、less、catコマンドを使用してファイルの内容を表示します

Linux では、cat、more、less の各コマンドを使用してファイルの内容を表示できます。c...

CSS3 transition-delay属性のデフォルト値が単位なしの0であり無効である問題を解決します

今日は、CSS3 の transition-delay 属性のデフォルト値 0 に単位がないのは無効...

MySQL データベース トランザクション例のチュートリアル

目次1. トランザクションとは何ですか? 2. トランザクションに関連するステートメントは、挿入、削...

非常に詳細な MySQL8.0.22 のインストールと設定のチュートリアル

みなさんこんにちは。今日は、MySQL 8.0.22 のインストールと構成について学習します。注意深...

Vue 関数のアンチシェイクとスロットリングの正しい使用方法

序文1. デバウンス: 高頻度イベントがトリガーされた後、関数は n 秒以内に 1 回だけ実行されま...