zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    堆(heap)和栈(stack)的区别
    STL容器学习总结
    从瀑布模型、极限编程到敏捷开发
    智力题
    Trie树详解及其应用
    理解inode
    找出字符串中连续出现次数最多的子串
    Oracle数据库中大数据量查询优化问题分区表的操作方法
    “在解决方案中的一个或多个项目由于以下原因未能加载 项目文件或网站已移动或重新命名,或者不在您的计算机上” 的解决办法
    转:完全卸载Oracle方法
  • 原文地址:https://www.cnblogs.com/ExMan/p/10408218.html
Copyright © 2011-2022 走看看