Det är inte så lätt att svara på denna fråga. Du bör veta en viktig sak:MySQL behandlar IN (<static values list>) och IN (<subquery>) som olika frågor
. Den första är lika med intervalljämförelse (som .. OR = .. OR = ) medan andra är lika med = ANY () - och det är inte samma sak. Så, för att säga kort:med IN med subquery kommer att orsaka fråga med ANY() och MySQL kommer inte att använda index för det även om underfrågan är oberoende och returnerar statisk värdelista . Tråkigt men sant. MySQL kan inte förutsäga det och därför kommer index inte att användas även om det är uppenbart. Om du använder JOIN (dvs skriv om din IN (<subquery>) ) - då kommer MySQL att använda index för JOIN skick, om det är möjligt.
Nu kan det andra fallet handla om JOIN och IN när du använder partitioner. Om du använder JOIN - då, tyvärr - men MySQL kan inte heller förutsäga partitioner för JOIN i vanligt fall - och det kommer att använda hela uppsättningen av partitioner för det. Ersätter JOIN till IN (<static list>) kommer att ändra EXPLAIN PARTITION bild:MySQL kommer endast att använda de partitioner som behövs för att välja värden från intervallet, specificerade inom IN klausul. Men återigen, detta kommer inte att fungera med IN (<subquery>) .
Som en slutsats - det är tråkigt när vi säger om hur MySQL hanterar IN subqueries - och i vanliga fall kan den inte ersättas med JOIN säkert (det handlar om partitioneringsväska). Så en vanlig lösning kommer att vara:separat delfråga från huvudfrågan på applikationsnivå . Om vi säger om oberoende underfråga, returnerande lista med statiska värden, är det det bästa förslaget - då kan du ersätta den värdelistan som IN(<static list>) och få fördelar:MySQL kommer att använda index för det, och, om vi säger om partitioner, kommer bara de som faktiskt behövs från dem att användas.