sql >> Database >  >> RDS >> Mysql

Waarom is MySQL traag bij het gebruik van LIMIT in mijn query?

Indexen verbeteren niet noodzakelijkerwijs de prestaties. Om beter te begrijpen wat er gebeurt, zou het helpen als u de explain . opneemt voor de verschillende vragen.

Mijn beste gok zou zijn dat je een index hebt in id_state of zelfs id_state, id_mp die kan worden gebruikt om te voldoen aan de where clausule. Zo ja, de eerste zoekopdracht zonder de order by zou deze index gebruiken. Het zou behoorlijk snel moeten zijn. Zelfs zonder een index vereist dit een sequentiële scan van de pagina's in de orders tafel, wat nog steeds behoorlijk snel kan zijn.

Wanneer u vervolgens de index toevoegt op creation_date , MySQL besluit in plaats daarvan die index te gebruiken voor de order by . Hiervoor moet elke rij in de index worden gelezen en vervolgens de bijbehorende gegevenspagina worden opgehaald om de where . te controleren voorwaarden en retourneer de kolommen (als er een overeenkomst is). Deze lezing is zeer inefficiënt, omdat het niet in "pagina"-volgorde is, maar eerder zoals gespecificeerd door de index. Willekeurig lezen kan behoorlijk inefficiënt zijn.

Erger nog, ook al heb je een limit , moet je nog steeds de hele . lezen tabel omdat de volledige resultatenset nodig is. Hoewel je een sortering op 38 records hebt opgeslagen, heb je een enorm inefficiënte query gemaakt.

Trouwens, deze situatie wordt aanzienlijk erger als de orders tabel past niet in het beschikbare geheugen. Dan heb je een toestand die "thrashing" wordt genoemd, waarbij elke nieuwe record de neiging heeft om een ​​nieuwe I/O-lezing te genereren. Dus als een pagina 100 records bevat, moet de pagina mogelijk 100 keer worden gelezen.

U kunt al deze zoekopdrachten sneller laten verlopen door een index te hebben op orders(id_state, id_mp, creation_date) . De where clausule gebruikt de eerste twee kolommen en de order by zal de laatste gebruiken.



  1. MySQL:hoe selecteert u records voor deze week?

  2. Kan één schema meerdere gebruikers hebben?

  3. Is het mogelijk om in MySQL een kolom te maken met een expressie als standaardwaarde?

  4. Speciale tekens van Oracle