以下に示すようなテーブルを作成しました
リーリーwhere 句に基づいて行を選択し、結果を並べ替える大規模なクエリがあります。
リーリーEXPLAIN を実行して、このクエリに最適なインデックスを見つけようとしています。 いくつかの異なるインデックスを作成しました;
EXPLAIN クエリでは次が表示されます;
リーリーなぜ ORDER BY 列 (index1 と Index3) を含むインデックスを使用せず、WHERE 句の列のサブセットのみを含むインデックスを選択するのか不思議です。インデックス 1 はクエリの列全体をカバーしており、理想的だと思います。
ORDER BY 列のみをカバーするインデックス (index2) は、 possible_keys にまったく表示されません。ここでインデックスを間違った順序で定義しているのでしょうか?
クエリで 1 つのインデックスを使用してフィルタリングし、別のインデックスを使用して結果を並べ替えることは可能ですか?
ご覧のとおり、448 行のテストを実行しています。クエリは、最大 100 万個までの大きなテーブルに対して実行できます。大きなテーブルの場合、他のインデックスの方がインデックス 4 よりもパフォーマンスが高くなるでしょうか?
最後に、多くの列を含むインデックス 1 のようなインデックスは、列の数だけが原因でパフォーマンスを低下させるのでしょうか?
3 つの可能性:
この組み合わせは、選択的に「十分」である場合に便利です:
INDEX(dialed, in_use, Schedule)
。これら 3 つの順序は重要ではありません。MySQL 8.0 を使用している場合は、これが役立つ可能性があります (指定された順序で):
リーリー古いバージョンでは
DESC
が無視されるため、使用できなくなりますINDEX
偶数 (これも 8.0 上):
リーリー