sql >> データベース >  >> RDS >> Mysql

複合インデックスはMySQLに方向性がありますか?

    最大の取得速度が必要で、結合またはwhere条件に両方の列がある場合、ただし、列aの選択性が高い場合と、列bの選択性が高い場合があり、単一のインデックスからその事実を利用したい場合があります。

    また、マシンのデータサイズとパフォーマンスの比率は非常に高くなければならないと思います。同時に、(数パーセントであっても)改善を必要と呼ぶ必要があります(推測)。

    >

    それでも、経験は物事が多くの要因に依存することを教えています。特定のRDBMSおよびアプリケーション環境を使用すると、独自のベンチマークをより適切に実行できます。

    編集:複合インデックスの詳細説明。wikipedia から :
    "インデックス定義で列がリストされる順序は重要です。最初のインデックス付き列のみを使用して行識別子のセットを取得することは可能です。ただし、それは不可能または効率的ではありません(onほとんどのデータベース)、2番目以降のインデックス付き列のみを使用して行識別子のセットを取得します。
    たとえば、最初に都市、次に姓、次に名で編成された電話帳を想像してみてください。都市が指定されている場合、その都市のすべての電話番号のリストを簡単に抽出できます。ただし、この電話帳では、特定の姓のすべての電話番号を見つけるのは非常に面倒です。各都市の内を調べる必要があります。その姓のエントリのセクション。」

    ウィキペディアの説明は単純化されすぎているかもしれませんが、基本的な考え方がわかります(電話帳には通常クラスター化インデックスがあり、それは一般的なデータベースインデックスではないことに注意してください)。

    インデックスのサイズ、データ構造のサイズ、使用可能なメモリ、インデックスの最初の列の選択性によっては、テーブルスキャンを使用するよりも、間違った順序のインデックスを使用する方がはるかに安価な場合があります。

    ああ、あなたが探している例とのより良い類似性を考えただけです素敵な教科書を想像してみてください、それは章と副章とそれらがいるページの数を含む目次を持っているでしょう(これはへのポインタを保持する非クラスター化インデックスですデータレコード-ページ)ここで、教科書がSQL-92標準であると想像すると、目次のほとんどの用語はSQL用語になります(この仮定を保持します)。また、本の最後に別のインデックスがあります。興味深い用語をすべてアルファベット順にリストします(主要な章の名前を想定します)。

    「DISTINCTが表示されるすべての章を教えてください」などの質問には、2番目のインデックスを使用します(後のフィールドの選択性が高いため)

    「最初の章の下に表示される用語の数を教えてください」などの質問には、目次を使用します

    したがって、「SELECTはDMLの章で説明されていますか?」などの質問の場合。どちらのインデックスも使用できます(両方のフィールドの選択性が高いため)。ただし、DML自体のTOCが3ページで、インデックスのSELECTエントリが15行しかない場合は、おそらく2番目のインデックスに移動します。両方のインデックスの恩恵を受ける場合の例。

    さて、それがあまりにもフェッチされていると思われる場合は、スキャンされた米国議会図書館のデータベースを考慮に入れてください。 :)

    前に述べたように、すべての計画は問題ありませんが、最後に独自のベンチマークを実行してください。



    1. 複数の列に対する一意の制約

    2. MySQLの共通テーブル式

    3. Oracle SQL Developerでテーブルを作成する方法は?

    4. 最初の行の後でMySQLクエリを停止する