Mysql
 sql >> Database >  >> RDS >> Mysql

Come devo procedere per l'indicizzazione di una query con due condizioni di intervallo?

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.