跳到主要内容

MongoDB 地理位置查询,别把距离计算全丢给应用层

· 阅读需 2 分钟
一介布衣
全栈开发者

带坐标的数据一多,最常见的需求之一就是“按距离最近排序”。
很多人一开始会先把经纬度查出来,再在应用层自己算距离、自己排序。小数据量时确实能跑,但 2016 年我在看这类场景时越来越觉得,所有距离计算都堆在应用层,其实是在主动放弃数据库已经能帮你做的一部分工作。

应用层全算为什么会越来越吃力

因为它天然意味着:

  • 先拉一批候选数据到服务端
  • 再逐条做距离计算
  • 最后在内存里排序和截断

数据一旦上来,CPU 和内存压力都会转到应用层,而且网络传输也会跟着变重。

数据库层的价值不只是“能算”

MongoDB 做地理位置查询时更有价值的一点,是它能在靠近数据的地方先帮你做筛选。
也就是说,很多时候你不需要先把所有候选点捞出来,再自己决定谁更近,而是可以让数据库先把不可能命中的部分压掉。

这不仅是性能问题,也是系统边界问题:该在数据层完成的粗筛,就别一股脑搬到应用层。

我后来更喜欢的思路

我会把职责拆成两段:

  • 数据库层做地理相关的基础筛选和排序
  • 应用层再补业务规则,比如营业状态、内容可见性、额外过滤

这样两边都做自己更擅长的事,整体会稳很多。

小结

MongoDB 地理位置查询最容易犯的错,就是觉得“距离公式我会写,所以都放应用层也没事”。
真正到线上数据量和请求量起来后,这种做法很快就会变得笨重。2016 年之后我对这类查询的态度越来越明确:数据库层能力该用的时候就要用,不然应用层只是在替它背不必要的压力。