【问题标题】:Non-trivial geolocation query db caching非平凡的地理位置查询数据库缓存
【发布时间】:2011-01-18 15:49:50
【问题描述】:

首先我不得不说我在缓存方面确实是一个菜鸟,所以请详细说明任何解释,如果我的问题很愚蠢,请多多包涵。

我有一个资源非常有限的服务器,所以我对尽可能有效地缓存数据库查询非常感兴趣。我的问题是这样的:

我有一个带有地理定位表的 MYSQL 数据库,有列(lat 和 lng)——我只索引 lat,因为查询总是同时包含 lat 和 lng,据我的理解,只有 1 个索引可以有效地使用( ?)。

查询在坐标上非常交替,例如

select lat, lng 
where lat BETWEEN 123123123 AND 312412312 AND lng BETWEEN 235124231 AND 34123124

作为BETWEEN 查询边界的长数字在不断变化,所以有没有办法以聪明的方式缓存它,这样缓存就不必是完整的查询匹配,但是查询之间的先前值可以针对新的值保存以节省一些数据库资源?

我希望你能得到我的问题 - 如果没有,请询​​问。

非常感谢

2011 年 1 月 24 日更新

现在我得到了一些回复,我想知道最有效的查询方式是什么。

  1. 具有 int 值的 Between 查询会执行得更快还是
  2. 使用点值进行半径计算会执行得更快吗

如果 1. 那么最佳索引会是什么样子?

【问题讨论】:

  • @Carl Manaster, @Quassnoi 您认为我的 lat/lon 列的最佳数据类型是什么?这意味着我在 lat 上使用索引或 POINT 计算搜索 BETWEEN 的查询会更快?
  • @Carl Manaster, @Quassnoi 非常感谢您就最有效的 int 索引或点计算提供意见?

标签: sql mysql caching


【解决方案1】:

如果您的表是MyISAM,您可以使用Point 数据类型(有关详细信息,请参阅this answer

如果您不愿意或无法使用空间索引,则应该使用两个单独的索引:

CREATE INDEX ix_mytable_lat_lon ON mytable (lat, lon)
CREATE INDEX ix_mytable_lon_lat ON mytable (lon, lat)

在这种情况下,MySQL 可以在这些索引上使用index_intersect,这有时比仅使用单个索引进行过滤要快。

即使没有,如果有其中两个,它也可以选择更具选择性的索引。

至于缓存,从索引中读取的所有页面都被缓存并驻留在内存中,直到它们被更热的数据覆盖(并非所有数据库都适合缓存)。

这将防止MySQL 需要从磁盘读取数据。

MySQL 也可以将整个结果集缓存在内存中,但是,这需要逐字重复查询,并且所有参数完全相同。

【讨论】:

  • 这是一个很好的答案!我实际上不知道存在空间索引,所以谢谢你告诉我——现在我得到了地图的边界并调用“中间”来获取地图可视范围内的任何标记。这比空间效率低吗?似乎半径需要某种圆计算,而且我真的很希望不要在数据库上放置太多负载。您对对数据库造成最小压力的方法有何看法?
  • @Jakob: BETWEEN 只能使用索引过滤latlon,不能同时使用两者。如果您的查询是 OK 以返回正方形内但不在其内圆内的对象,那么您可以只使用一对中间值。圆形计算看起来很庞大,但对于现代处理器来说实际上并不难。读取和传输额外数据可能意味着比一对浮点指令更多的开销。
  • 地图是方形的,点是按等级过滤的,而不是它们与mapCenter的距离,所以方形在功能上还可以,我考虑的主要是服务器负载和速度。我可以让您详细说明您已举例说明的索引吗?我无法理解为什么我需要两个,我可能对合并订单没有了解。
【解决方案2】:

我认为要做得更好,您需要更好地表征您的数据。如果您的数据在经度和纬度上均匀分布,没有相关性,并且如果您的查询具有类似的分布和独立性,那么您就会陷入困境。但是,如果您的数据或查询以有趣的方式聚集在一起,您可能会发现可以引入新的列,至少使某些查询更快。如果大多数查询发生在某个硬范围内,也许您可​​以将这些数据放在一边——添加一个标志,将其链接到其他表,甚至将频繁请求的数据放入自己的表中。你能告诉我们更多关于数据的信息吗?

【讨论】:

  • 感谢您的参与,我真的很喜欢听到这些想法。不幸的是,这些标记几乎分散在全世界,而且查询非常不同。我可能应该更多地研究索引,因为我从你的回复中得到了它,缓存真的只是在优化查询并且数据结构尽可能好之后才需要考虑?
  • @Jakob,如果查询非常不同,我认为缓存不太可能对您有很大帮助。在这种情况下,感兴趣的数据在缓存中的可能性很小,因此即使缓存数据的性能优势非常高,获得这种优势的可能性也会非常低。对不起!
  • 感谢您的意见 - 有时正确的答案是“问另一个问题”,而这似乎就是其中之一。感谢您向我指出这一点。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2019-05-12
  • 1970-01-01
相关资源
最近更新 更多