9

次の構造のSQLクエリがあります。

SELECT *, storedfunc(param, table.field) as f 
FROM table 
WHERE storedfunc(param, table.field) < value 
ORDER BY storedfunc(param, table.field);

これを最適化して、いくつかの関数呼び出しを排除する方法はありますか?それとも、MySQLはそのような最適化を舞台裏で実行しますか?実際、関数は決定論的として宣言されています。

また、関数paramsは、選択したテーブルの列から部分的に取得されていることにも言及する必要があります。これを反映するために、例を少し変更しました。

4

1 に答える 1

9

どちらがより高速に実行されるかを書き直してテストします。

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
WHERE storedfunc(param, table.column) < value 
ORDER BY f ;

SELECT *
FROM
  ( SELECT *, storedfunc(param, table.column) AS f 
    FROM table 
  ) AS tmp
WHERE f < value 
ORDER BY f ;

MySQLでは、次のように書くこともできます(警告:標準のSQL構文ではありません):

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
HAVING f < value 
ORDER BY f ;
于 2012-06-11T09:52:18.710 に答える