ホームページ >データベース >mysql チュートリアル >範囲クエリに最適な複合インデックスはどれですか: 高カーディナリティ列と低カーディナリティ列?
範囲クエリを使用した複合インデックスでの高カーディナリティ列の配置
範囲条件を含む複合インデックスを使用してテーブルをクエリする場合、インデックス内の列はパフォーマンスに大きな影響を与える可能性があります。
主キーを持つテーブル ファイルを検討してください。 (did, filename) と 2 つの複合インデックス: INDEX(filetime, ext) と INDEX(ext, filetime)。どちらのインデックスにも、ext よりもカーディナリティが高い filetime 列が含まれています。
クエリ:
WHERE ext = '...' AND filetime BETWEEN ... AND ...
では、ext と filetime の両方に基づいてデータにアクセスする必要があります。このようなクエリにはどのインデックスが最適ですか?
分析
最適なインデックスを決定するには、FORCE INDEX を使用して実行計画を調べることができます。
-- Force range on filetime first FORCE INDEX(fe) SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH; -- Force low-cardinality ext first FORCE INDEX(ef) SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
出力は、INDEX(ext, filetime) (ef) の行数が大幅に少ないことを示しています。
オプティマイザー トレース
オプティマイザーの動作をさらに分析するには、オプティマイザー トレースを使用できます。
SELECT explain_format = 'JSON'; SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
トレースにより次のことがわかります。オプティマイザはインデックスの両方の列をフィルタリングとフェッチに使用できるため、INDEX(ext, filetime) を選択します。 データ。対照的に、INDEX(filetime, ext) は、フィルター処理に最初の列 (filetime) のみを使用できます。
結論
分析に基づいて、次の結論が得られます。描画:
以上が範囲クエリに最適な複合インデックスはどれですか: 高カーディナリティ列と低カーディナリティ列?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。