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.