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

Dotaz MySQL je pomalý při použití funkce Order By s funkcí pro výpočet vzdálenosti mezi dvěma body (long, lat)

Možnosti:

  1. Zahrňte třídění do definice/logiky uložené procedury. Pokud vaše volání SQL select v rámci vaší uložené procedury proveďte řazení a omezení tam . - To znamená, že nebudete produkovat 10 000 řádků v uložené proceduře, ale pouze je uchýlit. Pokud má tabulka indexy, původní řazení v rámci SQL může být také mnohem rychlejší.

  2. Ověřte, že se v tabulce používá indexování. - Indexy způsobí, že vaše řazení bude při výběru na stole rychlejší.

Poskytněte nám prosím definici funkce, bylo by snazší vám dodatečně pomoci.

Nakonec se pokuste přesunout svou objednávku o a limit přímo ve vaší funkci, nikoli později. Vaše funkce může vrátit 10 výsledků přímo seřazených a připravených. Pokud chcete, vytvořte dvě funkce – jednu, která vrátí úplné výsledky, a jednu, která je vrátí omezené a seřazené.

Aktualizace:

Po zhlédnutí vaší funkce je zřejmé, že se snažíte řadit podle vypočítané hodnoty. Seřazení podle vypočítaných hodnot je extrémně pomalé, jak je také zmíněno v:

Snažím se přemýšlet, jak byste mohli „předběžně zpracovat/uspořádat“ svá data na základě col1 nebo col2, abyste urychlili konečné uspořádání vašich výsledků. Pokud jsou sloupce1 a sloupec2 sloupce tabulky a funResult je matematická funkce, kterou lze zobrazit v grafu, jedna z nich má vyšší vliv na návratovou hodnotu funkce....

A konečně, pokud col1 a col2 jsou sloupce myTable, nemusíte použít uloženou funkci, ale můžete se s ní dotazovat, ale to by neznamenalo velký rozdíl...Vaším hlavním problémem je řazení podle vypočítané funkce:

SELECT rowId, ((col1-INPUT_CONST)*2)+(col2*3) AS funResult
FROM myTable
ORDER BY funResult DESC
LIMIT 10

Aktualizace 2:

Po vyhrabání problému s řazením vypočítané vzdálenosti jsem zjistil, že toto bylo velmi efektivně dotazováno a vyřešeno na níže uvedeném odkazu. Ve vztahu k třídění podle vypočítané hodnoty je vaše třídění podle vypočítané hodnoty přirozeně pomalé. Další nápovědu naleznete na následujících dvou odkazech:

Nakonec, nejblíže k vaší odpovědi je toto: https://stackoverflow.com/a/4180065/1688441



  1. laravel errno 150 omezení cizího klíče je nesprávně vytvořeno

  2. Použití JDeveloper s databází MySQL a databází Oracle na AWS RDS, část 3

  3. Jak zjistit aktuální úroveň transakce?

  4. AES _Šifrování v Mysql , Dešifrování v C#.Net