「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 範囲クエリに最適な複合インデックスはどれですか: 高カーディナリティ列と低カーディナリティ列?

範囲クエリに最適な複合インデックスはどれですか: 高カーディナリティ列と低カーディナリティ列?

2024 年 12 月 21 日に公開
ブラウズ:531

Which Composite Index is Optimal for Range Queries: High vs. Low Cardinality Columns?

範囲クエリを使用した複合インデックスでの高カーディナリティ列の配置

範囲条件を含む複合インデックスを使用してテーブルをクエリする場合、インデックス内の列はパフォーマンスに大きな影響を与える可能性があります。

主キー (did、ファイル名) と 2 つの複合キーを持つテーブル ファイルを考えてみましょう。インデックス: INDEX(filetime, ext) および INDEX(ext, filetime)。どちらのインデックスにも、ext.

クエリ:

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'
  AND filetime 

出力は、INDEX(ext, filetime) (ef) の行数が大幅に少なく、より効率的なスキャンを示していることを示しています。

オプティマイザー トレース

オプティマイザーの動作をさらに分析するには、オプティマイザー トレース:

SELECT explain_format = 'JSON';

SELECT COUNT(*), AVG(fsize)
FROM files
WHERE ext = 'gif'
  AND filetime >= '2015-01-01'
  AND filetime 

トレースは、オプティマイザーがインデックスの両方の列を使用してデータのフィルタリングとフェッチを行うことができるため、INDEX(ext, filetime) を選択することを示しています。対照的に、INDEX(filetime, ext) は、フィルター処理に最初の列 (filetime) のみを使用できます。

結論

分析に基づくと、次の結論が得られます。描画:

  • 範囲クエリで使用される複合インデックスの場合、等価述語に含まれる列 (この場合は ext) は
  • インデックス内の列が WHERE 句で使用される順序に従って並べ替えられると、クエリのパフォーマンスが向上します。
  • カーディナリティだけでは問題は解決されません。最適なインデックスを決定するための決定的な要素。範囲列のカーディナリティが高いが、等価列が等価述語に関係しているシナリオでは、等価列を最初に配置するとパフォーマンスが向上します。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3