Mysql Stored Routines 函式使用 實現騰訊地圖 距離計算
Mysql Stored Routines,有儲存過程(Procedures)和函式(Functions),在實際專案使用中用的比較多,是傳統企業資訊系統的最愛,比如很多分析報表幾乎都依賴儲存過程實現。Mysql參考手冊給出了Stored Routines 2個常用使用場景:
- When multiple client applications are written in different languages or work on different platforms, but need to perform the same database operations.(共用性)
- When security is paramount. Banks, for example, use stored procedures and functions for all common operations. This provides a consistent and secure environment, and routines can ensure that each operation is properly logged. In such a setup, applications and users would have no access to the database tables directly, but can only execute specific stored routines.(安全性)
隨著分散式計算、軟體服務化的發展,建議少用儲存過程,讓資料庫更多地做儲存的事情,而分析、計算交由應用程式去完成。另外一方面,合理使用Stored Routines的函式,確實能提升效能和開發效率。
1、一個根據經緯度計算兩點距離的案例
專案描述:
業務員要拜訪門店,根據業務員當前位置列舉出最近門店,因為門店資料已有10幾萬,且這個功能在小程式、PC客戶端都要用到,於是就在資料庫層面定義了一個計算兩點距離的函式。
函式sql程式碼:
CREATE DEFINER = `db_name`@`%` FUNCTION `calcJwdDistance` (
pos_jd1 VARCHAR (20),
pos_wd1 VARCHAR (20),
pos_jd2 VARCHAR (20),
pos_wd2 VARCHAR (20)
) RETURNS DOUBLE
BEGIN
RETURN ROUND(
12756.274 * ASIN(
SQRT(
POW(SIN((pos_wd2 * PI() / 180 - pos_wd1 * PI() / 180) / 2),2)
+ COS(pos_wd2 * PI() / 180) * COS(pos_wd1 * PI() / 180) * POW(
SIN((pos_jd2 * PI() / 180 - pos_jd1 * PI() / 180) / 2),2)
)
) * 1000,1
);
END
儲存過程、函式建立語法,見Mysql參考手冊5.7 14.1.16 CREATE PROCEDURE and CREATE FUNCTION Syntax章節。
函式說明:
1)4個引數,第一個點的經緯度座標,第二個點的經緯度座標;
2)返回兩點距離,米;
函式使用:
select shop_no, calcJwdDistance(pos_jd, pos_wd, '120.2478366523864', '30.20397326099307') distance
from sale_zd_shops
order by distance
假設當前位置座標經緯度為:120.2478366523864,30.20397326099307。則上述sql列舉出門店,按距離有近及遠排序。
2、儲存過程和函式使用注意事項
1)許可權問題
儲存過程或函式建立完畢後,請給應用程式資料庫連線使用者授權,否則執行報錯,
GRANT SELECT , EXECUTE ON proc|function TO user;
2)資料庫全域性設定問題
log_bin_trust_function_creators錯誤解決:
mysql > set global log_bin_trust_function_creators=1;
或修改my.cnf[my.ini]檔案
在[mysqld]加上log_bin_trust_function_creators=1