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

Optimering af MySQL ORDER BY på en beregning delt med WHERE

Nej, beregningen udføres ikke to gange, hvis den er skrevet på nøjagtig samme måde. Men hvis dit mål er at forbedre ydeevnen af ​​din applikation, vil du måske se på det større billede i stedet for at koncentrere dig om denne mindre detalje, som højst kunne give dig en faktor på to forskel. Et mere alvorligt problem er, at din forespørgsel forhindrer effektiv brug af indekser og vil resultere i en fuld scanning.

Jeg vil anbefale, at du ændrer din database, så du bruger geometritypen og opretter en rumligt indeks på dine data. Så kan du bruge MBRWithin for hurtigt at finde de punkter, der ligger inde i din cirkels afgrænsningsramme. Når du har fundet disse punkter, kan du kun køre din dyrere distancetest på disse punkter. Denne tilgang vil være betydeligt hurtigere, hvis din tabel er stor, og en typisk søgning returnerer kun en lille brøkdel af rækkerne.

Hvis du ikke kan ændre datamodellen, kan du stadig forbedre ydeevnen ved at bruge en afgrænsningsboks først, for eksempel WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60 . Afgrænsningsboksen vil kunne bruge et indeks, men fordi R-Tree-indekser kun understøttes på geometritypen, bliver du nødt til at bruge standard B-Tree-indekset, som ikke er så effektivt til denne type forespørgsel (men stadig meget bedre end hvad du gør i øjeblikket).



  1. mysql tilpasset global defineret variabel

  2. SQLSTATE[22007]:Ugyldigt datetime-format:1292 Forkert datetime-værdi:'2008-03-30 02:56:12'

  3. Brugerdefineret ORDER BY for at ignorere 'den'

  4. Brug af ODBC-data i RapidMiner