【发布时间】:2015-07-30 11:31:59
【问题描述】:
我正在构建一个 REST API,因此答案不能包含谷歌地图或 javascript 的东西。 在我们的应用中,我们有一个表格,其中包含如下所示的帖子:
ID | latitude | longitude | other_sutff
1 | 50.4371243 | 5.9681102 | ...
2 | 50.3305477 | 6.9420498 | ...
3 | -33.4510148 | 149.5519662 | ...
我们有一个带有地图的视图,其中显示了世界各地的所有帖子。 希望我们会有很多帖子,在地图上显示成千上万个标记会很荒谬。所以我们想按邻近度对它们进行分组,这样我们就可以按大陆有 2-3 个标记。
要清楚,我们需要这个: 图片来自https://github.com/googlemaps/js-marker-clusterer
我做了一些研究,发现 k-means 似乎是解决方案的一部分。 因为我在数学方面真的很差,所以我尝试了几个像这样的 php 库:https://github.com/bdelespierre/php-kmeans,这似乎做得不错。 但是,有一个缺点:每次加载地图时,我都必须解析所有表格。就性能而言,这很糟糕。
所以我想知道是否有人已经解决了这个问题,或者是否有更好的解决方案。
【问题讨论】:
-
您能否缓存集群结果以提高性能?例如,在数据库或某种其他类型的缓存层(如果您使用的是旧版本的 PHP,则为 APC)。
-
我不确定,该应用程序的工作方式会持续创建/销毁数据。
-
好吧,这很有趣。我认为这是一个很好的例子,缓存有时是一种权衡,您需要在实时信息和性能之间做出决定。这意味着它是一个巨大的灰色区域……但是您可以问自己一些问题:在给定的时间内(比如一分钟)我需要提供多少次这些数据?处理 SQL 请求需要多长时间 - 几秒钟或几分钟?如果显示的数据不是实时的,比如 30 秒、1 分钟、2 分钟前的数据,这有关系吗?目标是确定您的用户会接受什么。通常是性能 > 新鲜度。
-
除此之外,关注您的数据。有没有办法通过查看索引(在适当的情况下)或分析我的查询效率来加快查询速度?有没有办法连续或定期地预先计算结果集?
-
实际上,我并不担心我的 SQL 查询是一个简单的从哪里选择,即使当然需要一些表优化。我认为最慢的部分是在 PHP 端循环我的查询结果和构建组。但是,是的,我认为你是对的,数据可能是 5 分钟前的数据,但我的客户想要真正的实时数据。我将看看我可以用 OPcache 做什么。感谢您的建议@Darragh
标签: php mysql group-by coordinates