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