IN
è una specie tra =
e una "gamma". Quindi, cavillo con il titolo della domanda. È praticamente impossibile ottimizzare due gamme; un IN
inoltre un intervallo ha qualche possibilità di ottimizzazione.
Basato su
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
Fornirei 2 indici e lascerei che l'ottimizzatore decida quale utilizzare:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
Alcune versioni più recenti di MySQL/MariaDB possono scavalcare e utilizzare tutte e 3 le colonne nel secondo indice. In tutte le versioni le prime 2 colonne di entrambi gli indici lo rendono un candidato. La scelta può essere guidata dalle statistiche e può (o meno) essere la scelta "giusta".
Da AlarmId
non può essere NULL
, usa il modello:COUNT(*)
.
Dopo aver apportato tale modifica, ciascuno dei miei indici è "coprente", dando così un ulteriore impulso alle prestazioni.