IN
är typ mellan =
och ett "sortiment". Så jag käbblar med rubriken på frågan. Två områden är praktiskt taget omöjliga att optimera; en IN
plus att ett intervall har en viss chans till optimering.
Baserat på
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
Jag skulle tillhandahålla två index och låta Optimizern bestämma vilket som ska användas:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
Vissa nyare versioner av MySQL/MariaDB kan hoppa över och använda alla tre kolumner i andra index. I alla versioner gör de två första kolumnerna i båda indexen den till en kandidat. Valet kan styras av statistik, och kan (eller kanske inte) vara det "rätta" valet.
Sedan AlarmId
kan inte vara NULL
, använd mönstret:COUNT(*)
.
Efter att ha gjort den ändringen är vart och ett av mina index "täckande", vilket ger en extra boost i prestanda.