特定のテーブルの4つの異なる列を使用するクエリのパフォーマンスを向上させようとしている場合、4つの異なるインデックス(各列に個別に1つ)を作成する必要がありますか、それともすべての列を含む1つのインデックスを作成する必要がありますか?
3 に答える
私の経験では、4 つの値すべてを持つ 1 つのインデックスが最速です。where を使用する場合は、where に役立つ順序で列を配置するようにしてください。
通常、単一のインデックスはインデックスのマージよりも効果的であるため、f1 = 1 AND f2 = 2 AND f3 = 3 AND f4 = 4
単一のインデックスのような条件がある場合は正しい決定です。
最高のパフォーマンスを達成するには、カーディナリティ (個別の値の数) の降順でインデックス フィールドを列挙します。これは、分析される行数を減らすのに役立ちます。
4 フィールド未満のインデックスは、必要なメモリが少ないため、より効果的です。
http://www.mysqlperformanceblog.com/2008/08/22/multiple-column-index-vs-multiple-indexes/
4 つの列すべてを含むインデックス。WHERE で使用される列が最初に移動し、== 比較を行う列が最初に移動する必要があります。
整数列を優先すると、より良い結果が得られる場合があります。YMMV。
たとえば、
SELECT title, count(*) FROM table WHERE class = 'post' AND topic_id = 17
AND date > @@BeginDate and date < @@EndDate;
topic_id、post、date、title の順にインデックスが作成されます。
インデックスの「タイトル」は、データベースがクエリに一致するレコードの「タイトル」の値を検索できるようにするためにのみ使用され、データ テーブルへの追加アクセスは必要ありません。
最初のフィールドのレコードの分布のバランスが取れているほど、最良の結果が得られます (この例では、行の 10% が topic_id = 17 であるとします。文字列比較を実行することなく、残りの 90% を破棄します) 'post' を使用 -- 文字列比較が特にコストがかかるわけではありません. データによっては、日付を最初にインデックス付けして後で投稿するか、日付を最初に MySQL PARTITION として使用する方がよい場合もあります。