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

猜你喜欢

转载自blog.csdn.net/chuangxin/article/details/84811791
今日推荐