我在 MySQL 中有一个查询,它在表的每一行上运行一个存储函数,然后在返回前 10 行之前根据函数的结果对行进行排序。
SELECT rowId, MyFunction(x, y, constX, constY) AS funResult
FROM myTable
ORDER BY funResult DESC
LIMIT 10
问题是在一个有 10,000 行的表上运行需要几秒钟,这太慢了。该函数的结果无法计算并存储为表中的另一行,因为它采用 PHP 给出的常量,并且每次运行查询时都不同。
函数本身的速度不是问题,因为删除ORDER BY funResult DESC LIMIT 10
意味着查询在不到 0.01 秒内运行。
问题必须是对行进行排序 - 考虑到只需要前 10 行这一事实,有什么方法可以更快地完成?
更新
正在使用的简化函数计算每行与指定点之间的距离(其中 LAT_B 和 LON_B 是取决于查询的常量):
CREATE FUNCTION MyFunction(LAT_A float, LON_A float, LAT_B float, LON_B float)
RETURNS double
DETERMINISTIC
BEGIN
DECLARE tempCalc DOUBLE;
SET tempCalc = 3956 * 2 * ASIN(SQRT( POWER(SIN((LAT_A -abs( LAT_B)) * pi()/180 / 2),2)
+ COS(LAT_A * pi()/180 ) * COS( abs(LAT_B) * pi()/180)
* POWER(SIN((LON_A - LON_B)
* pi()/180 / 2), 2) ));
RETURN tempCalc;
END