背景最近、遅い SQL ステートメントによってシステム パフォーマンスの問題が頻繁に発生するようになったため、インデックスを最適化することにしました。一部のテーブル構造にはすでに多くのインデックスがあります。インデックスを追加し続けると、必然的にデータ挿入のパフォーマンスに影響します。では、この目標を達成するために複合インデックスを使用することは可能でしょうか?この記事で調べてみましょう。 複合インデックスを理解するwhere 条件で複数のフィールドが使用され、複数のフィールドにインデックスを付ける必要がある場合は、複合インデックスの使用を検討できます。たとえば、住所を検索する場合、都道府県と市区町村を入力する必要があります。この場合、都道府県と市区町村にインデックスを作成すると、データ量が多いときにクエリ速度が大幅に向上します。 複合インデックスの利点は何ですか?
欠点:
複合インデックスの使用に関する推奨事項: 1 つのテーブルに複数の複合インデックスを含めないでください。また、1 つの複合インデックスに 3 つ以上のフィールドを含めないでください。それを超過した場合は、必要性と他の代替手段があるかどうかを検討する必要があります。 左端一致原則複合インデックスは、左端一致の原則に従います。名前が示すように、複合インデックスでは、左端のフィールドが最初に一致します。したがって、複合インデックスを作成するときは、where 句で最も頻繁に使用されるフィールドが複合インデックスの左端に配置されます。 補助インデックスはB+ツリーで実装されています。複数の列を指定できますが、各列の比較優先順位は異なり、前に書いた方が優先順位が高くなります。一度省略が発生すると、B+ ツリー上で検索を続行することができないため (ギャップを埋めるなどの手段で解決しない限り)、最も左の連続一致に従って検索が実行されます。検索は B+ ツリー上で行われるため、条件の比較には当然、完全一致 (つまり、「=」と「IN」) が必要になります。 where 句では 2 つのフィールド c1 と c2 が使用されています。インデックスを作成するとき、2 つのフィールドの順序は (c1, c2) とすべきでしょうか、それとも (c2, c1) とすべきでしょうか。 正しいアプローチは、重複値が最も少ないものを最初に置くことです。たとえば、値の 95% が一意である場合は、それらを先頭に配置することを検討できます。 フィールド順序の影響複合インデックスは左端一致の原則に従いますが、where クエリ条件のフィールドもインデックスの順序で記述する必要がありますか? c1 = 1 かつ c2 = 4 の場合、t_user から * を選択します。 c2 = 4 かつ c1 = 1 の場合、t_user から * を選択します。 最初の SQL ステートメントの方が効率的であると示唆する記事を見ました。これは信頼できるでしょうか? 2 つのクエリ メソッドの条件は同じであり、結果も同じになるはずです。通常、MySQL では同じインデックスが使用されます。 MySQL のクエリ オプティマイザ explain を使用して上記の 2 つのステートメントを分析すると、実行プランがまったく同じであることがわかります。つまり、SQL ステートメント内のフィールドの順序は複合インデックス フィールドの順序と一致する必要はなく、クエリ オプティマイザーによって順序が自動的に調整されます。 効率に影響があるとすれば、それはおそらくクエリ オプティマイザの修正順序の影響であり、これはほとんど無視できる程度です。 単一のフィールドでインデックスをトリガーできますか? 複合インデックス (c1,c2,c3) は、3 つのインデックス (c1)、(c1,c2)、(c1,c2,c3) に相当しますが、クエリ条件に c1 のみが含まれている場合、インデックスが使用されることは明らかです。 c2 = 4 の場合の t_user から; 上記の記述はインデックスを通過しますか?これはいくつかの状況で説明できます。 c1 = 1 の場合の t_user からの * を選択します。 上記のステートメントのインデックス タイプは ref です。 ref タイプは、MySQL がインデックス内のすべてのデータをスキャンして判断することなく、特定のアルゴリズムに基づいて条件を満たすインデックスをすばやく見つけることを意味します。データをすばやく見つけるには、このタイプのインデックスが特定のデータ構造を満たしている必要があります。 c2 = 4 の場合、t_user から c2 を選択します。 上記のステートメントのインデックス タイプは index です。インデックス タイプは、MySQL がインデックス全体をスキャンすることを意味します。インデックスまたはインデックスの一部である限り、MySQL はそれをインデックス タイプでスキャンする可能性があります。この方法ではデータを 1 つずつ検索するため、パフォーマンスはあまり高くありません。 この例では、クエリ対象のフィールドに特定の要件があります。 where の条件は c2 であり、select でクエリ対象のフィールドは c2 のみであるため、インデックス タイプ index が使用されます。 c2 が * または他のフィールドに置き換えられた場合: c2 = 4 の場合の select * from t_user の説明 上記のステートメントでは、インデックスが使用されなくなったことがわかりますが、テーブル全体のスキャンが実行されます。これは、MySQL が左端一致の原則に従う理由も説明しています。 複合インデックスは単一のインデックスを置き換えることができますか?単一インデックス: (c1)、複合インデックス: (c1, c2)。 クエリ条件として c1 を使用すると、単一インデックスのクエリ速度は複合インデックスのクエリ速度とほぼ同じか、複合インデックスよりもわずかに速くなります。 まとめこの記事では、MySQL 複合インデックスを使用する際に注意すべきいくつかの知識ポイントをまとめています。使用時には、explain を使用して、SQL 文がインデックスを使用しているかどうか、またどのインデックスを使用しているかを確認できます。 MySQL 複合インデックスの仕組みについての記事はこれで終わりです。MySQL 複合インデックスの詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: 誰もが登録できるようにJiedaibaoを宣伝するにはどうすればよいでしょうか? ジエダイバオのプロモーション方法とスキル
Centos にプロジェクトをデプロイするときに奇妙な問題が見つかりました。データベース接続で例外...
<br />XHTML と CSS がオブジェクト指向だったらよかったのに。 。太陽は北...
1.1. ダウンロード:公式ウェブサイトから zip パッケージをダウンロードします。私は 64 ビ...
この記事では、アニメーション効果の非表示と表示を実現するためのJQueryの具体的なコードを参考まで...
!DOCTYPE HTML ドキュメントが準拠するドキュメント型定義 (DTD) を指定します。 ...
1. 需要絵が左から右へ無限ループで動く2. コードモバイルデバイスに適用されているため、rem 単...
序文ファイルのコピーによってハードドライブのスペースが大量に浪費され、ファイルを更新するときに混乱が...
<br />ウェブサイトを科学的にデザインする: アイトラッキング研究から学ぶ 23 の...
1. 背景ボタンは非常によく使われており、Element のボタン機能は非常に包括的です。この記事で...
この記事では、CSS3 を使用した Web サイトの商品表示の効果を紹介し、皆さんと共有します。詳細...
1. Pythonは起動時に自動的に実行されますPython の自己起動スクリプトがauto.pyで...
CentOS 7 では、次のようなコマンドを使用してホスト ポートをコンテナー ポートにマッピングす...
カスタムパラメータを渡すだけhtml <div id="アプリ"> ...
仕える: # chkconfig --list すべてのシステムサービスを一覧表示する# chkco...
目次ステップ1. ルーティング ルールを設定し、子構成項目を使用します。 2. ジャンプ(フルパスを...