2

一个大客户给了我一个大项目,我已经做了两个月了。我越来越接近解决方案,但它非常复杂,以至于我无法做到,所以我需要想法。

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

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

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

因此,优化不是一种选择。为此,我需要一个全新的概念模型。任何意见都将受到高度赞赏,因为这是一个非常复杂的项目,我在历史上找不到任何与之相近的东西——我什至看过有很多类似问题的 MMORPG,我做了一个很少,但在一个房间里拥有一百万玩家的概念仍然是 MMORPG 制造商所畏惧的。人们认为可能存在瓶颈越来越普遍,但让我说,这不是以这种方式优化的情况。我需要一个新模型,其中一个巨大的数据库保留在服务器上,但可以流畅地显示给用户。

一旦它可用于解决此问题的任何东西,我将立即奖励 500 个代表。

谢谢-丹尼尔。

4

3 回答 3

1

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

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

确保您的表被正确索引会对性能产生巨大影响。您需要确保查询正在使用索引来快速获取所需的记录。

一位朋友正在使用 Google 地图,他说如果地图上显示太多,API 真的会受到影响。这可能完全超出您的控制。

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

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

于 2012-06-27T08:36:33.807 回答
1

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

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

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

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

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

有了这个,永远不要低估你的代码优化。虽然这些差异对您来说似乎很微妙,但当成千上万的用户在数百万个查询中运行时,这些微小的差异确实会加起来。

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

  • 伊根
于 2012-06-27T08:37:49.840 回答
0

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

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

于 2012-06-27T08:37:57.683 回答