sql >> Databasteknik >  >> RDS >> Mysql

Finns det någon prestandaskillnad mellan BETWEEN och IN med MySQL eller i SQL i allmänhet?

BETWEEN bör överträffa IN i det här fallet (men gör mäta och kontrollera utförandeplaner också!), särskilt som n växer och eftersom statistiken fortfarande är korrekt. Låt oss anta:

  • m är storleken på ditt bord
  • n är storleken på ditt intervall

Index kan användas (n är liten jämfört med m )

  • I teorin, BETWEEN kan implementeras med en enda "räckviddsskanning" (Oracle speak) på primärnyckelindexet och sedan gå igenom högst n indexbladsnoder. Komplexiteten kommer att vara O(n + log m)

  • IN implementeras vanligtvis som en serie (loop) av n "räckviddssökningar" på primärnyckelindexet. Med m eftersom tabellens storlek är komplexiteten alltid O(n * log m) ... vilket alltid är värre (försumbart för mycket små tabeller m eller mycket små intervall n )

Index kan inte användas (n är en betydande del av m )

I vilket fall som helst får du en fullständig tabellskanning och utvärderar predikatet på varje rad:

  • BETWEEN måste utvärdera två predikat:ett för den nedre och ett för den övre gränsen. Komplexiteten är O(m)

  • IN behöver utvärdera som mest n predikat. Komplexiteten är O(m * n) ... vilket återigen alltid är värre, eller kanske O(m) om databasen kan optimera IN lista för att vara en hashmap, snarare än en lista med predikat.



  1. Hur gör man en databaslyssnare med java?

  2. Tips och knep för att navigera i PostgreSQL-communityt

  3. PostgreSQL nästa värde för sekvenserna?

  4. PGLogical 1.1-paket för PostgreSQL 9.6beta1