sql >> Database >  >> RDS >> Mysql

MYSQL-prestaties traag met filesort

Het probleem is dat MySQL slechts één index gebruikt bij het uitvoeren van de query. Als u een nieuwe index toevoegt die gebruikmaakt van de 3 velden in uw WHERE clausule, zal het de rijen sneller vinden.

ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);

Volgens de MySQL-documentatie ORDER BY Optimization :

Dit is wat er in jouw geval gebeurt. Zoals de uitvoer van EXPLAIN vertelt ons, de optimizer gebruikt de sleutel price om de rijen te vinden. Echter, de ORDER BY staat in het veld date_updated die niet hoort bij de sleutel price .

Om de rijen sneller te vinden EN de rijen sneller te sorteren, moet u een index toevoegen die alle velden bevat die worden gebruikt in de WHERE en in de ORDER BY clausules:

ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);

Het veld dat voor het sorteren wordt gebruikt, moet op de laatste positie in de index staan. Het heeft geen zin om price op te nemen in de index, omdat de voorwaarde die in de query wordt gebruikt, een reeks waarden retourneert.

Als EXPLAIN nog steeds aangeeft dat het filesort gebruikt, kunt u proberen MySQL te dwingen een index te gebruiken die u kiest:

SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC 
LIMIT 19990, 10

Het is meestal niet nodig om een ​​index te forceren, omdat de MySQL-optimizer meestal de juiste keuze maakt. Maar soms maakt het een slechte keuze, of niet de beste keuze. U moet enkele tests uitvoeren om te zien of het de prestaties verbetert of niet.



  1. Tabelstructuur kopiëren naar nieuwe tabel

  2. Hoe LIKE te gebruiken in SQL

  3. Cursors gebruiken voor paging in PostgreSQL

  4. Extreem grote XML-bestanden parseren in php