IN
je něco mezi =
a „rozsah“. Takže se dohaduji s názvem otázky. Dva rozsahy je prakticky nemožné optimalizovat; IN
plus rozsah má určitou šanci na optimalizaci.
Na základě
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
Poskytl bych 2 indexy a nechal optimalizátor rozhodnout, který použít:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
Některé novější verze MySQL/MariaDB mohou přeskočit a využít všechny 3 sloupce v druhé index. Ve všech verzích jsou první 2 sloupce každého indexu kandidátem. Volba může být řízena statistikami a může (nebo nemusí) být tou „správnou“ volbou.
Od AlarmId
nemůže být NULL
, použijte vzor:COUNT(*)
.
Po provedení této změny každý z mých indexů „pokrývá“, čímž poskytuje další zvýšení výkonu.