IN
=
の間のようなものです および「範囲」。それで、私は質問のタイトルをいじくりまわします。 2つの範囲を最適化することは事実上不可能です。 IN
さらに、範囲には最適化の可能性があります。
に基づく
WHERE `StartedAt` >= FROM_UNIXTIME(1518990000)
AND `StartedAt` < FROM_UNIXTIME(1518998400)
AND `DeviceId` IN (
UNHEX('00030000000000000000000000000000'),
UNHEX('000300000000000000000000000181cd'),
UNHEX('000300000000000000000000000e7cf6'),
UNHEX('000300000000000000000000000e7cf7'),
UNHEX('000300000000000000000000000f423f')
) AND `MarkedForDeletion` = FALSE
2つのインデックスを提供し、オプティマイザーにどちらを使用するかを決定させます。
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
MySQL / MariaDBの一部の新しいバージョンは、2番目で飛躍して3つの列すべてを利用できます。 索引。すべてのバージョンで、いずれかのインデックスの最初の2列が候補になります。選択は統計に基づいて行われる場合があり、「正しい」選択である場合とそうでない場合があります。
AlarmId
以降 NULL
にすることはできません 、パターンを使用します:COUNT(*)
。
その変更を行った後、私の各インデックスは「カバー」しているため、パフォーマンスがさらに向上します。