如何缓存 MySQL 地理空间查询?

发布于 2025-01-11 05:33:17 字数 514 浏览 0 评论 0原文

我有一个带有 redis 缓存和 MySQL 数据库的 API 服务器。我将在 MySQL 中保存地理空间数据,并且我想提供一个 API 来查找给定多边形中的一些点

例如,
GET /api/v1/stores?boundary=45.9527556390094, -113.39711818925397,26.27578565710524, -79.64711879402736 (左上,右下&纬度,经度)

我想把redis缓存API 和 MySQL 之间的关系,因为我认为 DB 在处理 API 请求时会产生瓶颈。我将在 MySQL 中使用 ST_GEOMFROMTEXT, ST_WITHIN 进行地理空间查询。

我发现为 MySQL 的地理空间查询结果设计缓存键非常困难。每个用户都会给出非常不同的地理空间边界值,因此不能将给定的边界值作为redis键。

在这种情况下,如何缓存来自 MySQL 的地理空间查询?

I have an API server with redis cache and MySQL database. I'll save geospatial data in MySQL, and I want to provide an API for finding some points in a given polygon.

For example,
GET /api/v1/stores?boundary=45.9527556390094, -113.39711818925397,26.27578565710524, -79.64711879402736 (left top, right bottom & latitude, longitude)

I want to put redis cache between API and MySQL because I think DB will make bottleneck while processing API requests. I will do geospatial queries using ST_GEOMFROMTEXT, ST_WITHIN in MySQL.

I found it very difficult to design cache key for geospatial query results from MySQL. Every user will give very different geospatial boundary values, so cannot make the given boundary values as redis keys.

In this case, how do I cache the geospatial queries from MySQL?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红玫瑰 2025-01-18 05:33:17

您每次都会得到完全相同相同的多边形吗?我怀疑不是。纬度/经度是根据手机的 GPS 坐标计算出来的吗?如果不完全相同,则查询后没有任何可缓存的内容。唯一的希望是缓存查询的运行。

改善延迟有助于提高吞吐量。除非整个数据集无法放入 buffer_pool,否则我希望您能够像这样每秒运行 1000 个查询(没有 Redis)。

关于“查找最近的”的更多讨论: http://mysql.rjweb.org/doc.php/ find_nearest_in_mysql
它包括一个有用的小数位表。 (小数点后 6 或 7 位就足够了。)

Will you get exactly the same polygon each time? I suspect not. The lat/lng are computed from the GPS coordinates of a cellphone? If not exactly the same, there is nothing cachable after the query. The only hope is to cache the running of the query.

Improving latency helps with throughput. Unless the entire dataset won't fit in the buffer_pool, I would expect you to be able to run perhaps 1000 queries per second like that (without Redis).

More discussion of "find nearest": http://mysql.rjweb.org/doc.php/find_nearest_in_mysql
It includes a table of how many decimal places are useful. (6 or 7 decimal places should be quite sufficient.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文