sql >> Databasteknik >  >> RDS >> Mysql

Varför är MySQL långsam när jag använder LIMIT i min fråga?

Index förbättrar inte nödvändigtvis prestandan. För att bättre förstå vad som händer skulle det hjälpa om du inkluderade explain för de olika frågorna.

Min bästa gissning är att du har ett index i id_state eller till och med id_state, id_mp som kan användas för att uppfylla var klausul. Om så är fallet, den första frågan utan order by skulle använda detta index. Det ska vara ganska snabbt. Även utan ett index kräver detta en sekventiell genomsökning av sidorna i order tabell, vilket fortfarande kan vara ganska snabbt.

Sedan när du lägger till indexet på creation_date , MySQL bestämmer sig för att använda det indexet istället för order by . Detta kräver att man läser varje rad i indexet och sedan hämtar motsvarande datasida för att kontrollera var villkor och returnera kolumnerna (om det finns en matchning). Denna läsning är mycket ineffektiv, eftersom den inte är i "sidordning" utan snarare enligt indexet. Slumpmässiga läsningar kan vara ganska ineffektiva.

Värre, även om du har en gräns , du måste fortfarande läsa hela tabell eftersom hela resultatuppsättningen behövs. Även om du har sparat en sortering på 38 poster, har du skapat en enormt ineffektiv fråga.

Förresten, den här situationen blir betydligt värre om beställer tabellen får inte plats i tillgängligt minne. Sedan har du ett tillstånd som kallas "thrashing", där varje ny post tenderar att generera en ny I/O-läsning. Så om en sida har 100 poster kan sidan behöva läsas 100 gånger.

Du kan få alla dessa frågor att köras snabbare genom att ha ett index på orders(id_state, id_mp, creation_date) . var sats kommer att använda de två första kolumnerna och order by kommer att använda den sista.



  1. Hur räknar man rader från två tabeller i en fråga?

  2. Kan inte ansluta till Oracle-databasen med JDBC om lösenordet har specialtecken

  3. WebApp (Tomcat-jdbc) Poolad DB-anslutning som ger undantag för övergivande

  4. Hur delar jag upp utdata från mysqldump i mindre filer?