sql >> Database >  >> RDS >> Mysql

inner join select (A,B) op A en B vs waar (A,B) in select(A, B) in mysql

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.




  1. Manieren waarop toegang uw bedrijf geld kan besparen

  2. Hoe bool naar int te converteren in MySql

  3. Hoe MySQL-implementaties te bewaken met Prometheus &Grafana op ScaleGrid

  4. Kan rootwachtwoord niet resetten:windows, MySQL8.0