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.