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

indre sammenføjning vælg (A,B) på A og B vs hvor (A,B) i vælg(A,B) i mysql

Det er ikke for let at besvare dette spørgsmål. Du bør vide en vigtig ting:MySQL behandler IN (<static values list>) og IN (<subquery>) som forskellige forespørgsler . Den første er lig med områdesammenligning (som .. OR = .. OR = ), mens anden er lig med = ANY () - og det er ikke det samme. Så kort sagt:ved at bruge IN med underforespørgsel vil forårsage forespørgsel med ANY() og MySQL vil ikke bruge indeks til det, selvom underforespørgslen er uafhængig og returnerer statisk liste over værdier . Trist men sandt. MySQL kan ikke forudsige det, og indekset vil derfor ikke blive brugt, selvom det er indlysende. Hvis du vil bruge JOIN (dvs. omskriv din IN (<subquery>) ) - så vil MySQL bruge indeks til JOIN tilstand, hvis det er muligt.

Nu kan det andet tilfælde handle om JOIN og IN ved brug af partitioner. Hvis du vil bruge JOIN - så desværre - men MySQL er heller ikke i stand til at forudsige partitioner for JOIN i almindeligt tilfælde - og det vil bruge hele sæt af partitioner til det. Erstatter JOIN til IN (<static list>) vil ændre EXPLAIN PARTITION billede:MySQL vil kun bruge de partitioner, som er nødvendige for at vælge værdier fra området, angivet i IN klausul. Men igen, dette vil ikke fungere med IN (<subquery>) .

Som en konklusion - det er trist, når vi siger om, hvordan MySQL håndterer IN underforespørgsler - og i almindelige tilfælde kan det ikke erstattes med JOIN sikkert (det handler om opdelingssager). Så almindelig løsning vil være:adskil underforespørgsel fra hovedforespørgsel på applikationsniveau . Hvis vi siger om uafhængig underforespørgsel, returnering af statiske værdier, er det det bedste forslag - så kan du erstatte denne værdiliste som IN(<static list>) og opnå fordele:MySQL vil bruge indeks til det, og hvis vi siger om partitioner, vil kun de faktisk nødvendige fra dem blive brugt.




  1. LIMIT offset eller OFFSET i en UPDATE SQL-forespørgsel

  2. Hvordan kan jeg oprette et indeks på understrengen af ​​en kolonne?

  3. Hvilken kolonnetype skal bruges til at gemme serialiserede data i en mysql db?

  4. Er et kald til PDOStatement::closeCursor() nødvendigt, hvis sætningsobjektet er frakoblet?