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 をインストールする方法

推薦する

JS関数のカリー化の詳細な説明

目次1. 補足知識ポイント: 関数の暗黙的な変換2. 補足知識: call/apply を使って配列...

CSS3 レーダースキャンマップのサンプルコード

CSS3 を使用して、クールなレーダースキャン画像を実現します。 コード上で直接: // インデック...

Reactのコンテキストとプロパティの説明

目次1. 文脈1. 使用シナリオ2. 使用手順3. 結論2. 小道具の詳細1. 子供の財産2. 小道...

CSS の clip-path プロパティの使用方法の詳細な説明

クリップパスの使用ポリゴン値は複数の座標点で構成されます。最初の値は x 方向、2 番目の値は y ...

...

JavaScriptのvar let constの違いは何ですか?

目次1. 繰り返し宣言1.1 変数1.2 しましょう1.3 定数2. 可変プロモーション2.1 変数...

Dockerを使用してシンプルなJava開発およびコンパイル環境を構築する方法の詳細な説明

Java 言語には多くのバージョンがあります。一般的に使用されている Java 8 に加えて、一部の...

MySQL にテーブルデータを挿入するときに中国語の文字化けが発生する問題を解決する方法

1. 問題開発中に、他のデータベースから MySQL データベース テーブルにデータを挿入すると、次...

Workermanはmysql接続プールのサンプルコードを書きます

まず、接続プールを使用する理由と、接続プールによってどのような問題が解決できるかを理解する必要があり...

mysqlは指定された期間内の統計データを取得します

mysqlは指定された期間内の統計データを取得します年別統計 選択 カウント(*)、 DATE_FO...

Docker プライベート ウェアハウスを構築する (自己署名方式)

作成したイメージを一元管理し、サービスの展開を容易にするために、プライベート Docker リポジト...

マウスがカード上に移動したときにフローティング効果を実現する CSS の使用例

原理ホバーしたときに要素に影を設定します: box-shadow で、通常とは異なるスタイルにします...

CSS クリアフロートクリア:both サンプルコード

今日はフロートのクリアについてお話します。フロートのクリアについてお話する前に、フロートとは何かを理...

border-image を使用してテキストバブルの境界線を実装する方法のサンプルコード

開発中に、非常に単純なテキストバブル効果に遭遇しました。これは、おおよそ次のようになります。 うーん...

Dockerを使用してMySQLデータベースをインストールするDeepinの詳細な説明

まずMySQLソースをクエリするdocker 検索 mysql公式ウェブサイトにアクセスしてイメージ...