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.