sql >> Databasteknik >  >> RDS >> Mysql

inre join select (A,B) på A och B kontra där (A,B) i select(A, B) i mysql

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.




  1. Slumpmässig ordning med Entity Framework och MySQL

  2. Jag verkar inte kunna koppla min PHP-sida till min SQL-testserver och databas

  3. Hur man lagrar återkommande datum med tanke på sommartid

  4. inklusive saknade (nollantal) rader när du använder GROUP BY