Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mam zająć się indeksowaniem zapytania z dwoma warunkami zakresu?

IN jest pomiędzy = i „zakres”. Więc spieram się z tytułem pytania. Dwa zakresy są praktycznie niemożliwe do zoptymalizowania; IN plus zakres ma pewną szansę na optymalizację.

Na podstawie

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

Dostarczyłbym 2 indeksy i pozwoliłem Optymalizatorowi zdecydować, którego użyć:

INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)

Niektóre nowsze wersje MySQL/MariaDB potrafią przeskoczyć i wykorzystać wszystkie 3 kolumny w sekundzie indeks. We wszystkich wersjach pierwsze 2 kolumny każdego indeksu czynią go kandydatem. Wybór może być oparty na statystykach i może (lub nie) być „właściwym” wyborem.

Od AlarmId nie może być NULL , użyj wzorca:COUNT(*) .

Po wprowadzeniu tej zmiany każdy z moich indeksów „zakrywa”, co daje dodatkowy wzrost wydajności.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlać albumy obrazów w postach? [przy użyciu tylko PHP i MYSQL]

  2. Importuj pojedynczą bazę danych z --all-databases dump

  3. Połącz się z bazą danych MySQL online z localhost

  4. Jak połączyć dwa stoły w MySQL

  5. Meteor z mysql