点击这里给金令牌猎头顾问发消息
 金令牌首页 金令牌猎头 十佳职业经理人评选 最佳雇主评选 加入俱乐部 《职业经理人周刊》 会员区   薪酬调查报告登录  
Rss订阅
《职业经理人周刊》 猎头公司
职业经理人俱乐部首页 >> 经理人资讯 >> 技术研发 >> 今日视点 >> 正文

MySQL 5.7 GIS特性与性能测试


  《职业经理人周刊》   猎头班长v微博   微信:AirPnP   2017/3/29
猎头职位搜索
猎头|自助猎头
兼职|推荐人才

姜承尧 破产码农

IT界最会讲故事的男同学

著名猎头机构推荐金领职位
金令牌搜索企业 职位 经理人 专访 社区 会员
军工仪器研发制造--电子工程师/项目经理30-50万北京
电网侧储能初创公司-全钒液流储能-收购德国技术团队--CEO150-200万 北京 深圳
央企背景-全钒液流电池电堆设计高级工程师(全钒液流储能)40-70万河北 深圳
新药/仿制药-研发系统-制剂部负责人CSO 60-70万北京 成都 江苏
光电通信芯片-INP光芯片设计资深专家80-150万深圳 青岛
语音操作系统产品经理(人工智能) 40-70万北京 天津
香港AI机器人-研发项目经理-图像处理/计算机视觉/机器学习算法60-100万香港 海外
中国著名航空材料公司-冶金(金相)专家 150-300万北京 西安

MySQL GIS功能与历史

GIS(Geographic Information System)是构建互联网LBS(Location Based Service)服务的核心技术。小伙伴们所熟知的大众点评、美团外卖、微信、陌陌这类应用都广泛地在使用GIS技术,比如用户查找附近的餐厅,附近商家,附近的好友等。简单来说,用户给出自己的地理信息,通常是经度与维度,应用返回附近的商家或用户信息,在此基础上应用再给出一些增值服务。

MySQL很早就支持空间数据类型,业界用的却非常少。印象中只有美团直接使用了MySQL作为LBS服务数据库。这其中最重要的原因是:

MySQL 5.7版本之前只有MyISAM引擎支持空间数据;

MySQL 5.7版本之前只有MyISAM支持R树查询;

MySQL 5.7版本之前地理空间类型性能比较一般;

MySQL 5.7版本之前地理空间函数支持度有限;

MySQL 5.7版本之前不支持GeoHash以及GeoJson;

由于上述种种原因,业界的LBS应用大多基于MongoDB数据库,因为MongoDB内置的geoindex非常好用,外加分片特性非常适合于LBS这样的应用。对于事务要求较高的应用场景,也有公司使用PostGIS。

MySQL 5.7 GIS改进

针对社区用户不断要求改进GIS的呼声(其实大多数用户还是希望生产中的数据库种类能越精简越好),MySQL官方团队对GIS进行了大幅的重构与优化,所有的这些改进都已整合到MySQL 5.7版本。这些改进包括但不限于:

通过Boost Geometry库重构之前的地理空间数据的代码实现;

增加很多通用的GIS函数,比如球面举例的计算函数ST_Distance_Sphere等;

InnoDB存储引擎原生支持地理空间数据类型

InnoDB存储引擎新增R树索引支持地理空间查询

MySQL 5.7 GIS的使用与性能

很多同学反映在前期调研或测试过程中会发现没有地图数据可供测试使用。其实,国外有一个OpenStreeMap的项目,用于收集各个国家的地图信息,官网地址:http://www.openstreetmap.org

小伙伴们可以首先可以在上面下载地图包,然后将数据导入到MySQL 5.7数据库进行测试。中国地图由于政策原因,并不是非常全,但是导入到数据库后核心的地图表nodes也有超过7G的大小,用来测试是足够了。如果嫌太大还可以下载每个城市的地图。

导入完之后就可进行测试了,现在用户只要关心表nodes即可,其表结构如下所示:

CREATETABLE`nodes`(

`id`bigint( 20) DEFAULTNULL,

`geom`geometry NOTNULL,

`user`varchar( 50) DEFAULTNULL,

`version`int( 11) DEFAULTNULL,

`timestamp`varchar( 20) DEFAULTNULL,

`uid`int( 11) DEFAULTNULL,

`changeset`int( 11) DEFAULTNULL,

UNIQUEKEY`i_nodeids`( `id`),SPATIAL KEY`i_geomidx`( `geom`)) ENGINE= InnoDBDEFAULTCHARSET=utf8mb4

可以看到列geom就是存放对应的地理空间信息,而且这时表nodes的存储引擎已经是InnoDB,并且i_geomidx索引是SPATIAL KEY。接着执行最常见的LBS需求:查找当前用户周围5公里的餐馆信息。比如查询杭州西湖音乐喷泉附近5公里的坐标信息,并根据距离进行排序。在MySQL 5.7中可以通过下面的SQL执行:

SELECTid, ST_Distance_Sphere(Point( 120.167673, 30.259498), geom) asdistance, ST_AsText(geom)

FROMnodes

WHEREST_Contains( ST_MakeEnvelope( Point(( 120.167673+( 5/ 111)), ( 30.259498+( 5/ 111))), Point(( 120.167673-( 5/ 111)), ( 30.259498-( 5/ 111)))), geom )

ORDERBYdistance LIMIT10;

函数ST_Distance_Sphere用于计算西湖音乐喷泉与附近建筑的球面距离,5.7直接可直接用过此函数计算得到,而无需通过自定义函数的方式来实现。函数ST_MakeEnvelope用于计算当前坐标5公里范围内的矩形,然后通过函数ST_Contains进行计算。而这时的执行计划可以看到已使用空间索引i_geomidx:

(root@localhost) [china]> EXPLAINSELECTid, -> ST_Distance_Sphere(Point( 120.167673, 30.259498), geom) asdistance, ST_AsText(geom) -> FROMnodes -> WHEREST_Contains( ST_MakeEnvelope( -> Point(( 120.167673+( 5/ 111)), ( 30.259498+( 5/ 111))), -> Point(( 120.167673-( 5/ 111)), ( 30.259498-( 5/ 111))) -> ), geom ) -> ORDERBYdistance LIMIT30G************** 1.row***********

id: 1select_type: SIMPLE

table: nodes

partitions: NULLtype: range

possible_keys: i_geomidx

key: i_geomidx key_len: 34ref: NULLrows: 300filtered: 100.00Extra: Usingwhere; Using filesort1 row in set, 1warning( 0.01sec)

R树索引虽好,但是计算量依然非常巨大。在4核8G的云主机测试场景下,CPU使用率已到220%,但却只有100 QPS(主键查询该主机规格可达1W QPS)。

MySQL 5.7 GeoHash

GeoHash的原理不在这里展开,感兴趣的同学可以自行去看下。MySQL 5.7原生提供了ST_Geohash函数,可将地理空间坐标转化为Geohash格式。结合虚拟列与函数索引,那么对与上面的问题可以通过下面的方式来解决。首先创建函数索引i_geohash_idx:

ALTERTABLEnodes ADDCOLUMNgeohash VARCHAR( 128) AS(st_geohash(geom, 6)) VIRTUAL;

ALTERTABLEADDINDEXi_geohash_idx(geohash);

接着执行通过geohash的九宫格特性来计算周围的距离:

SELECTid, ST_Distance_Sphere(Point( 120.167673, 30.259498), geom) asdistance, ST_AsText(geom)

FROMnodes

WHEREgeohash IN( 'wtmknk', 'wtmkn6', 'wtmkne', 'wtmkn5', 'wtmknh', 'wtmkns', 'wtmknd', 'wtmkn4', 'wtmkn7')

ORDERBYdistance LIMIT10;

通过上述SQL语句再进行性能测试发现性能可稳定在1200 QPS,这时CPU使用率已达395%。较之R树查询方式能有12倍的性能提升,并且相信随着云主机规格提升性能上还能有进一步的提升。

后续思考问题与讨论

通过上面的测试可以发现在MySQL 5.7下通过Geohash函数+函数索引功能能较好的满足LBS应用的性能需求。但是这里还有一些问题可作为后续思考:

导入数据时如何导入geometry类型的数据?

MongoDB vs MySQL vs PostGIS的单实例性能测试?

目前MySQL 5.7 GIS还存在的缺点是什么?

如果做分布式数据库架构设计,均衡字段该怎么选择?

我会将本次测试的脚本与OpenStreetMap导入程序上传到IMG QQ群,感兴趣的同学可以加入IMG QQ群,也欢迎同学们继续在群众讨论。

长期坚持原创真的很不容易,多次想放弃。坚持是一种信仰,专注是一种态度!点赞是对作者最好的褒奖哟。

BTW:想要加入IMG微信群请先加我个人微信号再获邀请:82946772

(来源:科技讯)


我们尊重原创者版权,除非我们确实无法确认作者以外,我们都会注明作者和来源。在此向原创者表示感谢。本网转载文章完全是为了内部学习、研究之非商业目的,若是涉及版权等问题,烦请联系 service@execunet.cn 或致电 010-85885475 删除,谢谢!

发表评论:
主题:
内容:
匿名发表 验证码: 登录名: 密码:   个人 企业
发帖须知:
一、请遵守中华人民共和国有关法律法规、《全国人大常委会关于维护互联网安全的决定》《互联网新闻信息服务管理规定》
二、请注意语言文明,尊重网络道德,并承担一切因您的行为而直接或间接引起的法律责任。
三、管理员有权保留或删除其管辖留言中的任意内容。
四、您在本站发表的言论,本站有权在网站内转载或引用。
五、发表本评论即表明您已经阅读并接受上述条款。
金令牌猎头
企业找猎头   职业经理人找猎头
CTO相关资讯
更多>> 
CTO焦点企业对话
更多>> 
CTO相关猎头职位
更多>> 
十大猎头公司推荐金领职位
关于我们 | 招聘猎头 | 猎头 | 自助猎头 | 悬赏招聘 | 十佳职业经理人评选 | 年度最佳雇主评选 | 会员登录 | 企业 | 职位 | 设为主页
联系我们 | 法律声明 | 搜索 | 猎头招聘 | 猎头公司 | 《职业经理人周刊》 | 职业经理人俱乐部 | 沙龙活动 | 资讯 | 刊例 | 收藏本站
Copyright® 版权所有  猎头服务热线:010-85885475 E-MAIL:club@execunet.cn
京ICP备05025905号-1   京公网安备 110105001605号
点击这里给金令牌猎头顾问发消息 猎头顾问