1. 程式人生 > >Mysql Stored Routines 函式使用 實現騰訊地圖 距離計算

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