sql >> Databáze >  >> RDS >> Mysql

Optimalizace MySQL ORDER BY na výpočtu sdíleném s WHERE

Ne, výpočet se neprovede dvakrát, pokud je zapsán úplně stejně. Pokud je však vaším cílem zlepšit výkon vaší aplikace, možná se budete chtít podívat na větší obrázek, spíše než se soustředit na tento malý detail, který by vám mohl poskytnout rozdíl nanejvýš dva. Závažnějším problémem je, že váš dotaz brání efektivnímu využití indexů a povede k úplnému prohledání.

Doporučil bych vám změnit databázi tak, abyste používali typ geometrie a vytvořili prostorový index na vašich datech. Pak můžete použít MBRWithin rychle najít body, které leží uvnitř ohraničujícího rámečku vašeho kruhu. Jakmile tyto body najdete, můžete provést svůj dražší test vzdálenosti pouze na těchto bodech. Tento přístup bude výrazně rychlejší, pokud je vaše tabulka velká a typické vyhledávání vrátí pouze malý zlomek řádků.

Pokud nemůžete změnit datový model, můžete přesto zlepšit výkon pomocí nejprve zaškrtnutí ohraničujícího rámečku, například WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60 . Zaškrtnutí ohraničujícího rámečku bude moci používat index, ale protože indexy R-Stromu jsou podporovány pouze na typu geometrie, budete muset použít standardní index B-Stromu, který není pro tento typ dotazu tak účinný (ale stále mnohem lepší než to, co právě děláte).



  1. SQL Server Hromadné vložení souboru CSV s nekonzistentními uvozovkami

  2. Co je to vztah jeden k mnoha v databázi? Vysvětlení s příklady

  3. ajax datová odpověď vždy 0 v php mysql

  4. Jak optimalizovat tabulku pro dotaz AVG?