sql >> Databáze >  >> RDS >> Mysql

Jak mám postupovat při indexování pro dotaz se dvěma podmínkami rozsahu?

IN je něco mezi = a „rozsah“. Takže se dohaduji s názvem otázky. Dva rozsahy je prakticky nemožné optimalizovat; IN plus rozsah má určitou šanci na optimalizaci.

Na základě

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

Poskytl bych 2 indexy a nechal optimalizátor rozhodnout, který použít:

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

Některé novější verze MySQL/MariaDB mohou přeskočit a využít všechny 3 sloupce v druhé index. Ve všech verzích jsou první 2 sloupce každého indexu kandidátem. Volba může být řízena statistikami a může (nebo nemusí) být tou „správnou“ volbou.

Od AlarmId nemůže být NULL , použijte vzor:COUNT(*) .

Po provedení této změny každý z mých indexů „pokrývá“, čímž poskytuje další zvýšení výkonu.



  1. Migrace stávajících dat auth.User do nového uživatelského modelu Django 1.5?

  2. Pokus o import souboru FoxPro DBF na SQL Server

  3. Proč jsou názvy tabulek/sloupců/indexů Oracle omezeny na 30 znaků?

  4. SQL INTERSECT