IN
er en slags mellem =
og en 'rækkevidde'. Så jeg skændes med titlen på spørgsmålet. To områder er praktisk talt umulige at optimere; en IN
plus en rækkevidde har en vis chance for optimering.
Baseret 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
Jeg ville give 2 indekser og lade optimeringsværktøjet bestemme, hvad der skal bruges:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
Nogle nyere versioner af MySQL/MariaDB kan springe og gøre brug af alle 3 kolonner i anden indeks. I alle versioner gør de første 2 kolonner i begge indeks det en kandidat. Valget kan være drevet af statistik, og kan (eller måske ikke) være det 'rigtige' valg.
Siden AlarmId
kan ikke være NULL
, brug mønsteret:COUNT(*)
.
Efter at have foretaget den ændring, er hvert af mine indekser "dækkende", hvilket giver et ekstra boost i ydeevnen.