MySQL Geometry扩展在地理位置计算中的效率优势
由于在Geometry中,有相关自带函数和SPATIAL INDEX的性能优化,可以让某些位置计算的效率提升。以下是几种计算方法的效果对比。
1. 数据准备
首先创建一个数据表,这是一个店铺数据表,结构如下:
创建语句:
CREATE TABLE `store_geometry` (
`id` int(11) NOT NULL,
`name` varchar(64) NOT NULL,
`latitude` double DEFAULT NULL,
`longitude` double DEFAULT NULL,
`city` varchar(16) DEFAULT NULL,
`district` varchar(16) DEFAULT NULL,
`address` varchar(64) DEFAULT NULL,
`geohash_8` varchar(16) DEFAULT NULL,
`geometry` geometry DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
然后插入数据,包含id,name,latitude,longitude,city,district,address这些字段的数值。
原始字段数值插入后,通过geometry函数计算出geometry字段的数值,并更新:
UPDATE `store_geometry` SET geometry=geomFromText(CONCAT('POINT(',longitude,' ',latitude,')'))
到此,数据准备工作完成。
2. 对比实例:筛选出在一定矩形范围内的店铺
对比时,表内共有100,000条左右的店铺数据。
矩形范围:
max_x=121.474243
min_x=121.470724
max_y=31.234504
min_y=31.230229
2.1 方法一:使用经度和纬度字段判断是否在此区间内
我们看看对latitude,longitude2个字段做索引前后的性能对比
先在索引前查询:
SET @max_x=121.474243;
SET @min_x=121.470724;
SET @max_y=31.234504;
SET @min_y=31.230229;
SELECT * FROM `store_geometry` WHERE longitude BETWEEN @min_x AND @max_x and latitude BETWEEN @min_y AND @max_y;
查询结果有70条,耗时0.473秒
然后索引后使用相同语句查询,速度有明显加快:
2.2 方法二:使用geometry字段数据和相关几何计算函数判断是否在此区间内
同样的我们先不对geometry字段创建索引
SET @mbr=geomFromText(CONCAT('POLYGON','((',@min_x,' ',@min_y,',',@max_x,' ',@min_y,',',@max_x,' ',@max_y,',',@min_x,' ',@max_y,',',@min_x,' ',@min_y,'))'));
SELECT * FROM `store_geometry` WHERE st_contains(@mbr, geometry);
查询结果相同,耗时如下:
然后对geometry创建索引,这里注意不要用mysql客户端工具在界面上创建,因为只能创建普通索引,没有效果。
CREATE SPATIAL INDEX i_geometry ON `store_geometry`(geometry);
然后用相同语句查询,结果如下:
3.结论
实验结果很明显,geometry扩展在进行位置计算时具有性能上的明显优势。
方法 | 索引 | 查询耗时(秒) |
使用经度和纬度字段 | no index | 0.473 |
index | 0.015 | |
使用geometry字段 | no index | 0.092 |
index | 0.008 |
最新文章
- Eclipse代码格式化规范
- 自定义MVC框架
- [原创]DC-DC输出端加电压会烧毁
- 设置java web工程中默认访问首页的几种方式
- Android 与Unity交互之Toast消息
- FineUI第十四天---布局之垂直布局和水平布局
- java的安装环境配置详细步骤
- 如何在windows7上安装启明星系统。
- 基于int的Linux的经典系统调用实现
- Bootstrap3.0学习第十一轮(输入框组)
- win7 64位系统下 PL/SQL无法连接的问题
- MSSQL常用函数大全
- rjs 合并压缩完 js 后 js 不压缩的问题
- randint模块无法加载
- DBUtils——handler
- NGINX Load Balancing - HTTP Load Balancer
- pandas处理时间序列(1):pd.Timestamp()、pd.Timedelta()、pd.datetime( )、 pd.Period()、pd.to_timestamp()、datetime.strftime()、pd.to_datetime( )、pd.to_period()
- ubuntu 增加一个用户 并赋予权限
- 本地MySQL的root所创建用户登录发生[Access denied for user 'root1'@'localhost' (using password: YES)]错误的解决方案
- scp命令拷贝
热门文章
- Caesars Cipher
- jquery中prop和attr的区别
- C++:获取指定目录下的所有文件
- Qt:表格 tableWidget
- 【BZOJ】3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)
- java程序设计基础篇 复习笔记 第六单元
- ftp的匿名用户的搭建
- c# DataTable行转列
- Linux:运行级别,root密码重置,救援模式,安装图形化界面
- Cannot forward after response has been committed 错误