sql >> Databasteknik >  >> RDS >> Mysql

Optimera MySQL ORDER BY på en beräkning som delas med WHERE

Nej, beräkningen kommer inte att utföras två gånger om den är skriven på exakt samma sätt. Men om ditt mål är att förbättra prestandan för din applikation så kanske du vill titta på helheten snarare än att koncentrera dig på denna mindre detalj som kan ge dig högst en faktor två skillnad. Ett allvarligare problem är att din fråga förhindrar effektiv användning av index och kommer att resultera i en fullständig genomsökning.

Jag skulle rekommendera att du ändrar din databas så att du använder geometritypen och skapar en spatialt index på dina uppgifter. Då kan du använda MBRWithin för att snabbt hitta punkterna som ligger innanför gränsrutan för din cirkel. När du har hittat dessa punkter kan du köra ditt dyrare distanstest endast på dessa punkter. Detta tillvägagångssätt kommer att vara betydligt snabbare om din tabell är stor och en typisk sökning returnerar endast en liten del av raderna.

Om du inte kan ändra datamodellen kan du fortfarande förbättra prestandan genom att använda en markeringsruta först, till exempel WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60 . Markeringsrutan kommer att kunna använda ett index, men eftersom R-Tree index endast stöds på geometritypen måste du använda standard B-Tree index som inte är lika effektivt för denna typ av fråga (men fortfarande mycket bättre än vad du gör just nu).



  1. Proceduren förväntar sig parameter som inte tillhandahölls

  2. Hur kan jag få antalet dagar mellan 2 datum i Oracle 11g?

  3. Vilken mysql-motor för enorma mängder data (loggning)?

  4. MySQL FULLTEXT Sök över>1 tabell