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 |
MySQL Geometry扩展在地理位置计算中的效率优势的更多相关文章
- FPGA计算中定标与位扩展的实现
我不知道名字取对没有,在FPGA计算中有时往往需要在不溢出的情况下将数扩大,从而获得更好的计算精度. 比如.在一个8位宽的系统中,将x=0000_0010,算术左移m=5位之后得到xt=0100_00 ...
- Mysql基础代码(不断完善中)
Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...
- PHP安装mysql.so扩展
在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...
- FPGA定点小数计算中截位形式的探讨
在FPGA设计过程中难免会碰到需要进行截位,那定点小数的计算过程中我们需要注意些什么呢? 首先,我们考虑如下计算式. sin cos 数据形式是 FIX_32_30 X Y Z 数据形式是 FIX_3 ...
- mysql空间扩展 VS PostGIS
http://www.cnblogs.com/LBSer/p/3629149.html 功能 Mysql spatial extension PostGIS 空间索引 仅MyISAM支持R树索引,I ...
- Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止
就这段时间,很多人在抱怨为什么自己的MySQL又打不开问题. 就“Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止”这个问题,我想到了几种方案解决: 一.首 ...
- AI芯片:高性能卷积计算中的数据复用
随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...
- PHP安装mysql.so扩展及相关PHP.ini 配置参数说明
在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...
- Mysql配置文件 扩展详细配置
目录 配置文件中有些特定参数 扩展配置 max_connections connect_timeout interactive_timeout|wait_timeout net_retry_count ...
随机推荐
- DSP基础学习-ADC采样
DSP基础学习-ADC采样 彭会锋 2015-04-27 22:30:03 在查看ADC采样例程的时候我发现了下面的代码挺有意思的 EALLOW; GpioCtrlRegs.GPAMUX2.bit.G ...
- HDU-4714-贪心
Tree2cycle Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Tot ...
- BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i ...
- 【Error】2003 - Can't connect to MySQL server on 'localhost' (10038)
此错误主要是连接MySQL地址的地址搞错了. 可以看下 MySQL 的配置文件 /etc/mysql/my.cnf, 其中绑定的本地地址如下: bind-address=127.0.0.1 将其注释掉 ...
- Highcharts 动态图
Highcharts 动态图 每秒更新曲线图 chart.events chart.event 属性中添加 load 方法(图表加载事件).在 1000 毫秒内随机产生数据点并生成图表. chart: ...
- 1: 介绍Prism5.0(纯汉语版)
Prism帮助更简单的设计丰富,灵活,易维护的WPF桌面程序.其中使用MVVM,组合式视图,事件聚合等设计模式.这很符合一些重要的架构设计及原则.帮助你创建一个模块化的应用程序——可以独立开发松耦 ...
- avr 烧录失败
用Atmel studio 6.0 配置mkII烧录器 使用上位机bat程序烧录 提示错误:firmware is old... 1参考(关于FUSe setting) http://www.cnbl ...
- 转:JAVA CAS原理深度分析
看了一堆文章,终于把Java CAS的原理深入分析清楚了. 感谢GOOGLE强大的搜索,借此挖苦下百度,依靠百度什么都学习不到! 参考文档: http://www.blogjava.net/xylz/ ...
- EasyAACEncoder海思/ARM平台优化G711、G726转AAC的CPU占用高问题
本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/75645378 引言 目前EasyDarwin ...
- JavaScript动态加载js文件
/********************************************************************* * JavaScript动态加载js文件 * 说明: * ...