sql >> Database teknologi >  >> RDS >> Mysql

Er der en præstationsforskel mellem BETWEEN og IN med MySQL eller i SQL generelt?

BETWEEN skal bedre end IN i dette tilfælde (men gør mål og kontroller også udførelsesplaner!), især som n vokser, og da statistikker stadig er nøjagtige. Lad os antage:

  • m er størrelsen på dit bord
  • n er størrelsen på dit område

Indeks kan bruges (n er lille sammenlignet med m )

  • I teorien BETWEEN kan implementeres med en enkelt "range scan" (Oracle speak) på det primære nøgleindeks, og derefter krydse højst n indeksbladsknuder. Kompleksiteten vil være O(n + log m)

  • IN er normalt implementeret som en serie (loop) af n "range scans" på det primære nøgleindeks. Med m er størrelsen af ​​tabellen, vil kompleksiteten altid være O(n * log m) ... hvilket altid er værre (ubetydeligt for meget små tabeller m eller meget små områder n )

Indeks kan ikke bruges (n er en betydelig del af m )

Under alle omstændigheder får du en fuld tabelscanning og evaluerer prædikatet på hver række:

  • BETWEEN skal evaluere to prædikater:Et for den nedre og et for den øvre grænse. Kompleksiteten er O(m)

  • IN skal højst evaluere n prædikater. Kompleksiteten er O(m * n) ... hvilket igen altid er værre, eller måske O(m) hvis databasen kan optimere IN liste til at være et hashmap, snarere end en liste over prædikater.



  1. MySQL binær vs char tegnsæt binær

  2. PHP isset() med flere parametre

  3. Opret et SQL Server Agent-job i Azure Data Studio

  4. Sådan henter du matchposter på tværs af flere tabeller i MySQL