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

Existuje rozdíl ve výkonu mezi BETWEEN a IN s MySQL nebo v SQL obecně?

BETWEEN měl by překonat IN v tomto případě (ale dělejte měřit a kontrolovat také prováděcí plány!), zejména jako n roste a statistiky jsou stále přesné. Předpokládejme:

  • m je velikost vašeho stolu
  • n je velikost vašeho rozsahu

Lze použít index (n je malý ve srovnání s m )

  • Teoreticky BETWEEN lze implementovat jediným „skenováním rozsahu“ (mluví Oracle) na indexu primárního klíče a poté procházet maximálně n uzly indexového listu. Složitost bude O(n + log m)

  • IN je obvykle implementován jako série (smyčka) n "prohledávání rozsahu" na indexu primárního klíče. Pomocí m vzhledem k velikosti tabulky bude složitost vždy O(n * log m) ... což je vždy horší (zanedbatelné pro velmi malé tabulky m nebo velmi malé rozsahy n )

Nelze použít index (n je významnou částí m )

V každém případě získáte úplný sken tabulky a vyhodnotíte predikát na každém řádku:

  • BETWEEN potřebuje vyhodnotit dva predikáty:jeden pro spodní a jeden pro horní hranici. Složitost je O(m)

  • IN potřebuje vyhodnotit maximálně n predikáty. Složitost je O(m * n) ... což je opět vždy horší, nebo možná O(m) pokud databáze dokáže optimalizovat IN seznam bude hashmap, spíše než seznam predikátů.



  1. ORA-01618

  2. Věštec. Jak vytisknout datum a čas?

  3. Přebudování MySQL 8.0 Replication Slave pomocí klonovacího pluginu

  4. =) Operátor pro začátečníky