数百万个列表已映射,100gb数据顺利显示,建议

时间:2012-06-27 08:20:46

标签: php javascript database google-maps

我被一个大客户给了一个大项目,我已经为它工作了2个月了。我越来越接近一个解决方案,但它太疯狂了,我无法到达那里,所以我需要一些想法。

项目非常简单:有一个1mil + lat / lng坐标数据库,每个记录都有大量附加数据。用户将访问页面并输入一些搜索条件,这些条件将过滤掉相当多的记录。所有与过滤器匹配的记录都会在Google地图上显示(通常是群集)。

问题在于客户要求快速,精简和低带宽。因此,我被困住了。我目前正在做的是:呈现第一个集群,当它们悬停在集群上时,开始加载该集群子集的数据。

然而,我已经把它增加到数百万个列表中的30,000个,并且它开始拖累一点。我做了尽可能多的优化。当更改过滤器时,我向数据库AJAX查询并返回匹配的所有ID,然后更新地图以反映这一点。

因此,优化不是一种选择。我需要一个全新的概念模型。任何输入都会受到高度赞赏,因为这是一个非常复杂的项目,我在历史上找不到任何东西,甚至远离它 - 我甚至看过有很多类似问题的MMORPG,我做了一个很少,但在一个房间里拥有一百万玩家的概念仍然是MMORPG制造商畏缩的事情。人们普遍认为可能存在瓶颈,但让我说这不是优化这种方式的情况。我需要一个新模型,其中一个庞大的数据库停留在服务器上,但是流畅地显示给用户。

一旦解决了这个问题,我将立即授予500名代表。

谢谢 - 丹尼尔。

3 个答案:

答案 0 :(得分:1)

我认为你的问题有很多可能的答案取决于它的减速程度,所以这里有一些想法。

更宽的表可以影响返回查询的速度。较长的记录意味着正在访问更多的光盘以获取正确的数据,因此您可能需要考虑限制初始表以仅保留可以过滤的信息。话虽如此,它还将取决于您使用的数据库引擎,有些人比其他人受到的影响更大。

确保表的正确索引会使性能产生巨大差异。您需要确保查询正在使用索引来快速访问所需的记录。

一位朋友正在使用谷歌地图,并表示如果地图上显示太多,那么API真的会受到影响。这可能完全不受您的控制。

过去曾为Epic Games工作过,“房间里数百万玩家”畏缩的原因更多的是硬件驱动。在游戏中,当尝试渲染模型的所有多边形时,拥有该数量的玩家会使显卡停止运转。其次(可能更重要的)问题是你必须向每个客户发送有关每个项目/玩家正在做什么的信息。这意味着您的带宽使用量将大幅增加。您的服务器可能会处理负载,但玩家的互联网连接可能不会。

我确实认为您需要编辑您的问题,但有一些关于什么的速度正在放慢的额外信息。你的数据库?您的查询? Google API?服务器和客户端机器之间的数据传输?

答案 1 :(得分:1)

我们在这里说实话;一个拥有100万条记录的数据库可能被大量用户访问,除非你把一些非常强大的硬件放在它后面,否则它不会运行得很好。

在这种情况下,我建议使用几个不同的数据库服务器,并建立一些不错的负载平衡机制,以使它们尽可能顺利地运行。首先,您需要找出可以在数据库服务器开始滞后之前放置的“平均”负载;比方说,这是50,000条记录。为每台服务器设置一个较低的MaxClients可以帮助您提高服务器性能并防止崩溃,但是当用户由于高负载而无法执行任何查询时,可能会加剧用户..但是如果您的预算没有预算,请记住这一点允许在硬件方面有很多摆动的空间。

关于硬件的话题,这是你真正需要看的东西。数据库通常不会使用大量的CPU / RAM,但它们可能会对您的HDD造成沉重负担。在您查看设置中的其他组件之前,我建议您使用SAS或SSD;这些将使你的世界变得与众不同。

就负载平衡而言,大多数内容提供商使用的一种非常常见的技术是,当一个查询/特定内容项(例如youtube上的热门视频等)吸引高于平均流量的流量时,您可以缓存其结果。快速而肮脏的方法是在搜索栏中使用if语句,然后获取静态html页面而不是实际运行查询。

另一种方法是独立使用单独的数据库服务器,仅用于运行占用过多流量的查询。

有了它,永远不要低估您的代码优化。虽然这些差异可能看起来很微妙,但当成千上万的用户遇到数百万个查询时,这些微小的差异确实会增加。

祝你好运 - 如果你需要任何进一步的帮助,请告诉我。

  • 锐衡

答案 2 :(得分:0)

Google有一项名为“Big Query”的服务。它是云中的sql Server。它使用快速服务器进行sql,它可以快速搜索数百万个数据行。不幸的是它不是免费的......但也许它会帮助你:

https://developers.google.com/bigquery/