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

Hvordan skal jeg indeksere en forespørgsel med to intervalbetingelser?

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.



  1. Oracle 12cR2 nu i Beta

  2. Forstå QUOTED_IDENTIFIER

  3. kan ikke vise varemærkesymbol i mysql til html

  4. Indsæt og sæt værdi med max()+1 problemer