sql >> Databasteknik >  >> RDS >> Mysql

Hur ska jag gå tillväga för att indexera för en fråga med två intervallvillkor?

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.



  1. Infoga i samma tabell trigger mysql

  2. Php/ODBC-kodningsproblem

  3. Databasversionskontroll för MySQL

  4. Varför nosql med cassandra istället för mysql?