テーブルの各行でストアド関数を実行し、最初の 10 行を返す前に、関数の結果によって行を並べ替えるクエリが MySQL にあります。
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