我在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