我们新开发了一个电商平台,需要实现附近的店铺功能,经过预研,觉得没有必要采用mongodb的地理位置查询功能,因为涉及数据同步,还有联合索引的问题。直接用MySQL5.7内置的距离计算功能就可以满足大规模计算距离的需求。

计算附近的店铺时侯,一般的需求是传入用户的坐标,需要计算出附近的店铺,按照用户和店铺的距离排序返回前端。在成千上万家店铺选择附近的店铺就涉及效率的问题了。最好的方式是先找到附近的店铺,然后再在选定的店铺范围内计算距离,这样就能大幅减少计算量。业界采用的是geohash,首先在获取店铺坐标时候,就计算出店铺的geohash,在用户传入坐标后,也计算出用户的geohash和他周围8个区域的geohash,然后看店铺如果在用户周围的geohash范围内,才计算店铺和用户之间的距离。这里有个问题,如果用户在一个周围都是店铺的区域,那么检索的范围可能比较小就可以拿到用户每次翻页所请求店铺数了,但是如果用户在一个周围店铺不多的区域内,就需要检索一个比较大的范围才可以拿到用户每次翻页所请求的店铺数。这里就涉及geohash的精度问题了,geohash位数越高,所表示的范围越小,距离用户越近,反之越远。店铺需要预先计算一个精度比较高的geohash,如果想要取比较大的区域,只需要店铺的geohash like用户的geohash前几位就可以了.每次用户请求的时候,前端需要告诉后台用户的gps坐标,其他过滤条件,之前已经返回给用户的商铺id列表,后台按照用户的gps坐标按照7位精度计算出用户周围的9个geohash区域,加上过滤条件和不需要计算的店铺id列表,查询一下附近的店铺数,如果店铺数小于前端请求的数据条数的2倍(这里取2倍是考虑过的,假设店铺是平均分布的,用户的位置比较极端,恰好在他所在的geohash的角上,这样距离他比较近的点就在它周围的4个区域内,其他的5个区域的点离他都比较远,从区域的数量上来看是4:5,接近1:1吧,所以就选了2倍,应该差不多),就将计算的geohash列表的位数缩小一位,再去查询用户周围的店铺数,如果满足条件就退出,否则一直计算到4位精度,然后用最后拿到的geohash列表和过滤条件真正去计算用户周围的店铺和距离用户的距离,返回给前端.这样能最小化数据库计算和排序的压力.即使这样,作为数据库仍然是压力比较大的,在这里采用多从库可以解决并发的问题.至此,我们实现了基于Mysql5.7查找附近的店铺,计算量压缩到了极致,并发达到了无限.

mysql查询周边商铺_基于Mysql5.7实现查找附近的店铺相关推荐

  1. mysql 查询存储过程 速度_查询mysql过程

    MySql 使用explain分析查询 今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义 ...

  2. mysql查询无限下级_示例php+mysql查询实现无限下级分类树输出

    本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. ...

  3. mysql 查询时间转换_数据库查询时日期的转换

    首先简单说明一下,laravel框架中查询并打印sql语句的办法,不管任何时候由于sql语句报错时,都可以先打印一下,分析一下是什么原因造成的错误 ①引入laravel框架DB类useIllumina ...

  4. mysql查询会话池_用户会话,数据控件和AM池

    mysql查询会话池 最近,有人问我有关应用程序模块池的有趣问题. 众所周知,AM池包含用户会话引用的应用程序模块实例,这允许会话在后续请求时从池中获取完全相同的AM实例. 如果应用程序中有多个根应用 ...

  5. php mysql查询中文乱码_解决php mysql查询插入中文乱码问题_PHP教程

    解决php mysql查询插入中文乱码问题 一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那 ...

  6. mysql 5.5.35 单机多实例配置详解_基于mysql-5.5.32的单机多实例多配置文件的

    1.安装环境: [root@localhost ~]# [root@localhost ~]# uname -a Linux localhost.localdomain 2.6.32-504.16.2 ...

  7. mysql 查询编码转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

  8. mysql数据生产数据分析_基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程...

    基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程 课程目录 (1)SQL与数Ju分析;目录中文件数:23个 (1) 开课-课时3SQL与数Ju库的价值.flv (2) ...

  9. mysql修改工资字段_基于Linux的MySQL操作实例(修改表结构,MySQL索引,MySQL数据引擎)...

    基于Linux的MySQL操作实例(修改表结构,MySQL索引,MySQL数据引擎) 前言 本篇是基于Linux下针对MySQL表结构的修改,MySQL索引的操作以及MySQL数据引擎的配置和说明. ...

最新文章

  1. LVS详解及基于LVS实现web服务器负载均衡
  2. 1-2月我国程控交换机产量同比减少13.96%
  3. 弧形背景html,JS实现带圆弧背景渐变效果的导航菜单代码
  4. 22行代码AC——例题7-1除法(Division UVa 725)——解题报告
  5. 使用PCL::GPU::遇到问题
  6. 10个步骤的筛选器模式
  7. 华为鸿蒙系统学习笔记3-方舟编译器介绍
  8. yii直接执行sql
  9. 含HTML标记的内容分页 (C#)
  10. oracle v$sysstat性能视图
  11. myisam 与 innodb的区别,在什么情况下用什么ENGINE
  12. 思维导图—Git命令全集
  13. 三极管共射放大电路静态工作点怎么设计
  14. Bert系列:论文阅读Learning-to-rank with bert in tf-ranking
  15. samtools faid产生的.fai文件详解
  16. Python自动化运维脚本
  17. Android基础第四篇
  18. 动态规划--基本思路理念
  19. java 三元运算符
  20. CH55X 基于Arduino框架开发程序上传相关注意事项

热门文章

  1. shell 脚本-01 变量、字符串、数组
  2. mysql 用大于等于代替大于_mysql使用详解
  3. 数学呼号可以学计算机吗,[数学]离散数学.ppt
  4. 谷歌的15条招人秘诀
  5. 大家好!我是happy_HuHu
  6. Android 热补丁技术——资源的热修复
  7. 从开发者的角度,如何看待提高软件质量
  8. vivado 基于cordic IP核的波形发生器
  9. 英语语法---状语详解
  10. 智慧协同新应用:FEv6.6,让组织更灵动/敏捷!