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.