1. 背景最近、遅い SQL ステートメントによってシステム パフォーマンスの問題が頻繁に発生するようになったため、インデックスを最適化することにしました。一部のテーブル構造にはすでに多くのインデックスがあります。インデックスを追加し続けると、必然的にデータ挿入のパフォーマンスに影響します。では、複合インデックスを使用して目標を達成することは可能でしょうか? この記事で見てみましょう。 2. 複合インデックスを理解する
複合インデックスの利点は何ですか?
欠点:
複合インデックスの使用に関する推奨事項: 1 つのテーブルに複数の複合インデックスを含めないでください。また、1 つの複合インデックスに 3 つ以上のフィールドを含めないでください。それを超過した場合は、必要性と他の代替手段があるかどうかを検討する必要があります。 3. 左端一致原則複合インデックスは、左端一致の原則に従います。名前が示すように、複合インデックスでは、左端のフィールドが最初に一致します。したがって、複合インデックスを作成するときは、 補助インデックスはB+ツリーで実装されています。複数の列を指定できますが、各列の比較優先順位は異なり、前に書いた方が優先順位が高くなります。一度省略が発生すると、B+ ツリー上で検索を続行することができないため (ギャップを埋めるなどの手段で解決しない限り)、最も左の連続一致に従って検索が実行されます。検索は B+ ツリー上で行われるため、条件の比較には当然、完全一致 (つまり、「=」と「IN」) が必要になります。 正しいアプローチは、重複値が最も少ないものを最初に置くことです。たとえば、値の 95% が一意である場合は、それらを先頭に配置することを検討できます。 4. フィールド順序の影響複合インデックスは左端一致の原則に従いますが、 たとえば、複合インデックスが (c1、c2、c3) の場合、次の 2 つのクエリ条件はインデックスに影響しますか? c1 = 1 かつ c2 = 4 の場合、t_user から * を選択します。 c2 = 4 かつ c1 = 1 の場合、t_user から * を選択します。 最初の SQL ステートメントの方が効率的だという記事を見ました。これは信用できますか? 2 つのクエリ メソッドの条件は同じで、結果も同じになるはずです。通常、 効率に影響があるとすれば、それはおそらくクエリ オプティマイザの修正順序の影響であり、これはほとんど無視できる程度です。 5. 単一のフィールドでインデックスをトリガーできますか?複合インデックス (c1,c2,c3) は、3 つのインデックス (c1)、(c1,c2)、(c1,c2,c3) に相当しますが、クエリ条件に c1 のみが含まれている場合、そのインデックスが使用されることは明らかです。 しかし、where 条件が次のようになっている場合はどうなるでしょうか。 c2 = 4 の場合の t_user から; 上記のステートメントはインデックスを使用しますか? これはいくつかの状況で説明できます。 条件として explan query c1 を使用して SQL ステートメントを実行します。 c1 = 1 の場合の t_user からの * を選択します。 上記のステートメントのインデックス タイプは ref です。 ref タイプは、MySQL がインデックス内のすべてのデータをスキャンして判断することなく、特定のアルゴリズムに基づいて条件を満たすインデックスをすばやく見つけることを意味します。データをすばやく見つけるには、このタイプのインデックスが特定のデータ構造を満たしている必要があります。 条件として explan query c2 を使用して SQL ステートメントを実行します。 c2 = 4 の場合、t_user から c2 を選択します。 上記のステートメントのインデックス タイプは この例では、クエリ対象のフィールドに特定の要件があります。 c2 が * または他のフィールドに置き換えられた場合: c2 = 4 の場合の select * from t_user の説明 上記のステートメントでは、インデックスが使用されなくなったことがわかりますが、テーブル全体のスキャンが実行されます。これは、MySQL が左端一致の原則に従う理由も説明しています。 結論は次のようになります。単一のフィールドが複合インデックスの最初のフィールドである場合、インデックスは通常どおり使用されます。単一のフィールドが複合インデックスの別のフィールドであり、このフィールドのみが 7. 複合インデックスは単一のインデックスを置き換えることができますか?単一インデックス: (c1)、 複合指数: (c1、c2)。 クエリ条件として c1 を使用すると、単一インデックスのクエリ速度は複合インデックスのクエリ速度とほぼ同じか、複合インデックスよりもわずかに速くなります。 複合クラスター化インデックスの開始列以外の列 (c2) のみをクエリ条件として使用した場合、複合インデックスは効果がありません。 テーブルに複合インデックス (c1、c2) がある場合は、単一のインデックス (c1) を作成する必要はありません。 単一のインデックス (c1) がすでに存在する場合、クエリで必要な場合は、複合インデックス (c1、c2) を追加して効率を向上させることができます。 まとめ: この記事では、MySQL 複合インデックスを使用する際に注意すべきいくつかの知識ポイントをまとめています。使用時には、explain を使用して、SQL 文がインデックスを使用しているかどうか、またどのインデックスを使用しているかを確認できます。 ただし、Mysql の実行プランとクエリの実際の実行プロセスは完全には一致しないことを理解する必要があります。 なぜ私がこれを知っているのかと聞かないでください。実際にこれに遭遇したからです。同じ SQL ステートメントでも、クエリ条件に応じてインデックスが使用される場合と使用されない場合があります。 MySQL複合インデックスの概要に関するこの記事はこれで終わりです。MySQL複合インデックスに関するより関連性の高いコンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Vueリクエストインターセプターの設定方法の詳しい説明
>>: CSS3を使用して背景画像の色を変更するさまざまな方法
ソースコード(一部のクラスは削除されています):コードをコピーコードは次のとおりです。 <テー...
目次1. Jquery を使用する手順: (1)jsライブラリをインポートする(2)ページ読み込みイ...
ページが非常に長い場合は、下にさらにコンテンツがあることをユーザーに知らせるために矢印が必要になるこ...
参考: Docker 公式 Redis ドキュメント1. 特別なバージョン要件がある場合は、redi...
この記事の主な内容は次のとおりです。 1. 閉じるボタン2.キャレット3. フローティングを素早く設...
CSS を使ってさまざまなグラフィックを実現できるのは素晴らしいことです。画像を切り取る必要はなく、...
誰でも時々データをコピーして貼り付ける必要があると思います。コピーして貼り付けるためにファイルを開く...
データベーステーブルA: テーブル task_desc_tab を作成します ( id INT(11...
私が使用しているデータベースはMySQLデータベースバージョン5.7ですまずデータベーステーブルを自...
目次スクロールをスムーズにするBetterScrollのスクロール体験慣性ローリングエッジリバウンド...
最近、関連テーブル内のすべてのフィールドをクエリし、それらを 1 つのフィールドに再グループ化する必...
最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...
目次序文$属性例: $listeners (公式説明)使用シナリオ要約する序文複数レベルのコンポーネ...
目次導入導入集計関数 + over()ソート関数 + over() ntile() 関数 + ove...
まず依存関係をダウンロードします yarn sass-loader ノード sass を追加します次...