検索

ホームページ  >  に質問  >  本文

WHERE 句と ORDER BY を使用したクエリ インデックスは使用されません

以下に示すようなテーブルを作成しました

リーリー

where 句に基づいて行を選択し、結果を並べ替える大規模なクエリがあります。

リーリー

EXPLAIN を実行して、このクエリに最適なインデックスを見つけようとしています。 いくつかの異なるインデックスを作成しました;

  1. (ダイヤル済み、使用中、スケジュール済み、優先度、data_6、data_5、data_4、data_3、seq_id)
  2. (優先度、データ_6、データ_5、データ_4、データ_3、順序ID)
  3. (スケジュール済み、使用中、ダイヤル済み、優先度、データ_6)
  4. (予約済み、使用中)

EXPLAIN クエリでは次が表示されます;

リーリー

なぜ ORDER BY 列 (index1 と Index3) を含むインデックスを使用せず、WHERE 句の列のサブセットのみを含むインデックスを選択するのか不思議です。インデックス 1 はクエリの列全体をカバーしており、理想的だと思います。

ORDER BY 列のみをカバーするインデックス (index2) は、 possible_keys にまったく表示されません。ここでインデックスを間違った順序で定義しているのでしょうか?

クエリで 1 つのインデックスを使用してフィルタリングし、別のインデックスを使用して結果を並べ替えることは可能ですか?

ご覧のとおり、448 行のテストを実行しています。クエリは、最大 100 万個までの大きなテーブルに対して実行できます。大きなテーブルの場合、他のインデックスの方がインデックス 4 よりもパフォーマンスが高くなるでしょうか?

最後に、多くの列を含むインデックス 1 のようなインデックスは、列の数だけが原因でパフォーマンスを低下させるのでしょうか?

P粉548512637P粉548512637370日前462

全員に返信(1)返信します

  • P粉178894235

    P粉1788942352024-02-18 11:30:24

    3 つの可能性:

    この組み合わせは、選択的に「十分」である場合に便利です: INDEX(dialed, in_use, Schedule)。これら 3 つの順序は重要ではありません。

    MySQL 8.0 を使用している場合は、これが役立つ可能性があります (指定された順序で):

    リーリー

    古いバージョンでは DESC が無視されるため、使用できなくなります INDEX

    偶数 (これも 8.0 上):

    リーリー

    返事
    0
  • キャンセル返事