sql >> Database teknologi >  >> RDS >> Mysql

MYSQL ydeevne langsom ved hjælp af filsortering

Problemet er, at MySQL kun bruger ét indeks, når forespørgslen udføres. Hvis du tilføjer et nyt indeks, der bruger de 3 felter i din WHERE klausul, vil den finde rækkerne hurtigere.

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

Ifølge MySQL-dokumentationen ORDER BY Optimization :

Dette er, hvad der sker i dit tilfælde. Som output fra EXPLAIN fortæller os, at optimeringsværktøjet bruger nøglen price for at finde rækkerne. Men ORDER BY er i feltet date_updated som ikke hører til nøglen price .

For at finde rækkerne hurtigere OG sortere rækkerne hurtigere, skal du tilføje et indeks, der indeholder alle de felter, der bruges i WHERE og i ORDER BY klausuler:

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

Feltet, der bruges til sortering, skal være på den sidste position i indekset. Det er nytteløst at inkludere price i indekset, fordi betingelsen, der bruges i forespørgslen, vil returnere en række værdier.

Hvis EXPLAIN stadig viser, at den bruger filesort, kan du prøve at tvinge MySQL til at bruge et indeks, du vælger:

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

Det er normalt ikke nødvendigt at fremtvinge et indeks, fordi MySQL optimizeren oftest gør det rigtige valg. Men nogle gange gør det et dårligt valg, eller ikke det bedste valg. Du bliver nødt til at køre nogle test for at se, om det forbedrer ydeevnen eller ej.



  1. Valg af sammenhængende blok af poster i mysql

  2. Sådan ændres kolonnedatatype fra tegn til numerisk i PostgreSQL 8.4

  3. Få MySQL-forespørgselsresultater som deres oprindelige datatype?

  4. Forståelse af hukommelsesbrug af MySQL resultat i PHP (PDO)