MySQLのストアドファンクションを使ってみた
まー、二点間の距離でソートしたいなーと思いつつ、PHPでソートしてたんですよね。遅いし、メンテナンス性低いしってことで。
そしたら、ストアドプロシージャ的なものがあるってことで。って、前から存在は知っていたんですけど、サボってたと。
この辺りを参考にさせていただいて。
MySQL ストアドファンクション - kozy.heteml.jp
で、速攻つまずいて。CREATE FUNCTION...とかやるとエラー。上のリンク先にも書かれているエラー。
と言うことで、ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
in its declaration and binary logging is enabled (you *might* want to use the less safe
log_bin_trust_function_creators variable)
で、回避。mysql> SET GLOBAL log_bin_trust_function_creators = 1;
そして、コマンドラインからは動作を確認。んが、今度はWebアプリから実行しようとしたら「Unknown Error」。なぜじゃー?とログを見てたら、ユーザの権限不足。
ストアドほにゃららを実行するには「EXECUTE」権限が必要なんですね。知らなんだ。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.1.3 GRANT 構文
と言うことで、
とやって、権限追加で上手く行きました。GRANT EXECUTE ON database_name.* TO ''@'localhost' ...
厳密に性能測定した訳じゃないですけど、速くなっているような。何よりも、DB操作をDBレイヤにまとめられたのが嬉しかったり。