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)
. order by
kommer att använda den sista.