Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es einen Leistungsunterschied zwischen BETWEEN und IN mit MySQL oder in SQL im Allgemeinen?

BETWEEN sollte IN übertreffen in diesem Fall (aber tun auch Ausführungspläne messen und prüfen!), insbesondere als n wächst und da Statistiken immer noch genau sind. Nehmen wir an:

  • m ist die Größe Ihres Tisches
  • n ist die Größe Ihres Sortiments

Index kann verwendet werden (n ist winzig im Vergleich zu m )

  • Theoretisch BETWEEN kann mit einem einzigen "Bereichsscan" (Oracle-Sprache) auf dem Primärschlüsselindex implementiert werden und dann höchstens n durchlaufen Indexblattknoten. Die Komplexität ist O(n + log m)

  • IN wird normalerweise als eine Reihe (Schleife) von n implementiert "Bereichsscans" auf dem Primärschlüsselindex. Mit m Da es sich um die Größe der Tabelle handelt, ist die Komplexität immer O(n * log m) ... was immer schlimmer ist (vernachlässigbar für sehr kleine Tabellen m oder sehr kleine Bereiche n )

Index kann nicht verwendet werden (n ist ein wesentlicher Teil von m )

In jedem Fall erhalten Sie einen vollständigen Tabellenscan und werten das Prädikat für jede Zeile aus:

  • BETWEEN muss zwei Prädikate auswerten:Eines für die untere und eines für die obere Grenze. Die Komplexität ist O(m)

  • IN muss höchstens n auswerten Prädikate. Die Komplexität ist O(m * n) ... was wiederum immer schlimmer ist, oder vielleicht O(m) ob die Datenbank den IN optimieren kann Liste als Hashmap und nicht als Liste von Prädikaten.