範囲クエリを使用した複合インデックスでの高カーディナリティ列の配置
範囲条件を含む複合インデックスを使用してテーブルをクエリする場合、インデックス内の列はパフォーマンスに大きな影響を与える可能性があります。
主キー (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) のみを使用できます。
結論
分析に基づくと、次の結論が得られます。描画:
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3