非平凡的地理定位查询db缓存

时间:2011-01-18 15:49:50

标签: sql mysql caching

我首先要说的是我真的是缓存中的新手,所以请详细说明任何解释,如果我的问题很愚蠢,请耐心等待。

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

我有一个MySQL数据库与geolocations一张桌子,还有列(纬度和经度) - 我只索引LAT因为查询总会有两个纬度和经度,只有1指数可以有效地利用我的理解( ?)。

查询在坐标中非常交替,如

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

,其中长数字属于BETWEEN的查询都在不断变化的边界,所以是有高速缓存该智能方式,使缓存不必须是完整的查询匹配的方式,但是之前的查询之间的值可以保持一个新的以保存一些数据库资源吗?

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

非常感谢

更新24/01/2011

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

  1. 使用int值的Between查询执行得更快还是
  2. 使用点值进行半径计算会更快
  3. 如果1.那么最佳指数会如何?

2 个答案:

答案 0 :(得分:2)

如果您的表格为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也可以将整个结果集缓存在内存中,但是,这需要逐字重复查询,所有参数都完全相同。

答案 1 :(得分:2)

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