sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Varför ändrar det femte ID:t i IN-klausulen drastiskt frågeplanen?

Som du har visat har MySQL två alternativa frågeplaner för frågor med ORDER BY ... LIMIT n :

  1. Läs alla kvalificerade rader, sortera dem och välj n översta raderna.
  2. Läs raderna i sorterad ordning och sluta när n kvalificerande rader har hittats.

För att avgöra vilket som är det bästa alternativet måste optimeraren uppskatta filtreringseffekten av ditt WHERE-tillstånd. Detta är inte okomplicerat, särskilt för kolumner som inte är indexerade, eller för kolumner där värden är korrelerade. I ditt fall måste man förmodligen läsa mycket mer av tabellen i sorterad ordning för att hitta de första 25 kvalificerade raderna än vad optimeraren förväntade sig.

Det har skett flera förbättringar i hur LIMIT-frågor hanteras, både i senare versioner av 5.6 (du kör på en pre-GA-utgåva!), och i nyare versioner (5.7, 8.0). Jag föreslår att du försöker uppgradera till en senare version och se om detta fortfarande är ett problem.

I allmänhet, om du vill förstå frågeplanerarens beslut bör du titta på optimeringsspårningen för frågan.



  1. orakel | radera dubbletter av poster

  2. mysql 5.7 log-slow-queries-fel

  3. Slå samman radvärden till en CSV (a.k.a GROUP_CONCAT för SQL Server)

  4. Hur roterar man PgBouncer-loggar i Linux/Windows?