Dit is niet zo eenvoudig om deze vraag te beantwoorden. Je moet één belangrijk ding weten:MySQL behandelt IN (<static values list>)
en IN (<subquery>)
als verschillende zoekopdrachten
. De eerste is gelijk aan bereikvergelijking (zoals .. OR = .. OR =
) terwijl tweede gelijk is aan = ANY ()
- en het is niet hetzelfde. Dus, om het kort te zeggen:gebruik IN
met subquery zal een zoekopdracht veroorzaken met ANY()
en MySQL zal daarvoor geen index gebruiken, zelfs als de subquery onafhankelijk is en statische lijst met waarden retourneert . Triest, maar waar. MySQL kan dat niet voorspellen en daarom wordt index niet gebruikt, ook al is het duidelijk. Als je JOIN
. gebruikt (d.w.z. herschrijf uw IN (<subquery>)
) - dan zal MySQL index gebruiken voor JOIN
staat, als het mogelijk is.
Nu kan het tweede geval gaan over JOIN
en IN
bij gebruik van partities. Als je JOIN
. gebruikt - helaas - maar MySQL kan ook geen partities voorspellen voor JOIN
in het algemeen - en het zal er een hele set partities voor gebruiken. Vervanging van JOIN
naar IN (<static list>)
zal EXPLAIN PARTITION
veranderen afbeelding:MySQL gebruikt alleen die partities die nodig zijn voor het selecteren van waarden uit het bereik, gespecificeerd in IN
clausule. Maar nogmaals, dit werkt niet met IN (<subquery>)
.
Als conclusie - het is triest als we zeggen hoe MySQL omgaat met IN
subquery's - en in het algemeen kan het niet worden vervangen door JOIN
veilig (dat gaat over het partitioneren van case). De algemene oplossing is dus:subquery scheiden van hoofdquery op applicatieniveau . Als we het hebben over onafhankelijke subquery's, waarbij een statische lijst met waarden wordt geretourneerd, is dat de beste suggestie - dan kunt u die lijst met waarden vervangen door IN(<static list>)
en profiteer van voordelen:MySQL zal er index voor gebruiken en, als we het over partities hebben, zal alleen de daadwerkelijk benodigde partities worden gebruikt.