由于在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扩展在地理位置计算中的效率优势的更多相关文章

  1. FPGA计算中定标与位扩展的实现

    我不知道名字取对没有,在FPGA计算中有时往往需要在不溢出的情况下将数扩大,从而获得更好的计算精度. 比如.在一个8位宽的系统中,将x=0000_0010,算术左移m=5位之后得到xt=0100_00 ...

  2. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  3. PHP安装mysql.so扩展

    在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...

  4. FPGA定点小数计算中截位形式的探讨

    在FPGA设计过程中难免会碰到需要进行截位,那定点小数的计算过程中我们需要注意些什么呢? 首先,我们考虑如下计算式. sin cos 数据形式是 FIX_32_30 X Y Z 数据形式是 FIX_3 ...

  5. mysql空间扩展 VS PostGIS

    http://www.cnblogs.com/LBSer/p/3629149.html 功能 Mysql spatial extension  PostGIS 空间索引 仅MyISAM支持R树索引,I ...

  6. Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止

    就这段时间,很多人在抱怨为什么自己的MySQL又打不开问题. 就“Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止”这个问题,我想到了几种方案解决: 一.首 ...

  7. AI芯片:高性能卷积计算中的数据复用

    随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...

  8. PHP安装mysql.so扩展及相关PHP.ini 配置参数说明

    在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...

  9. Mysql配置文件 扩展详细配置

    目录 配置文件中有些特定参数 扩展配置 max_connections connect_timeout interactive_timeout|wait_timeout net_retry_count ...

随机推荐

  1. tensorflow入门(三)

    三种代价函数 1,二次代价函数   式子代表预测值与样本值的差得平方和 由于使用的是梯度下降法,我们对变量w,b分别求偏导: 这种函数对于处理线性的关系比较好,但是如果遇到s型函数(如下图所示),效率 ...

  2. Jenkins学习之旅

    学习博客:http://www.cnblogs.com/zz0412/tag/jenkins/   https://jenkins.io/doc/   http://www.cnblogs.com/h ...

  3. guava学习--cache

    转载:http://outofmemory.cn/java/guava/cache/how-to-use-guava-cache   http://www.cnblogs.com/parryyang/ ...

  4. hdu 1536&&1944 S-Nim sg函数 难度:0

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. bzoj2547

    题解: 二分+宽搜+KM 显然答案不能太大 然后二分一下 代码: #include<bits/stdc++.h> ,M=; using namespace std; ]={-,,,},dy ...

  6. 【QT】QML的Mouse事件(MouseArea)详解

    https://blog.csdn.net/ieearth/article/details/42082837

  7. Win10 怎么给php文件设置默认打开应用

    一,首先以管理员身份打开命令提示符 二,assoc .php=phpfile 创建一个文件关联 三,ftype phpfile="E:\Program Files\Sublime Text ...

  8. Python基础学习----字典常用操作

    字典的常见操作: # 字典: # 格式:{键值对,键值对} dict_demo={"name":"bai-boy","age":17} # ...

  9. 转一个有意思的利用存储过程备份恢复PostgreSQL

    [转自 housonglin1213 的博客]http://blog.csdn.net/housonglin1213/article/details/51005540 1.自定义函数脚本备份 CREA ...

  10. Java Double 精度问题总结

    package Demo_1.Test_2; import java.math.BigDecimal; /** * @描述:Java Double 精度问题总结 * @详细描述:使用Java,doub ...