【问题标题】:Best way to deal with 900,000 record database and zip codes?处理 900,000 条记录数据库和邮政编码的最佳方法?
【发布时间】:2011-06-08 05:37:10
【问题描述】:

与我们有业务往来的公司希望每天向我们提供一个 1.2 GB 的 CSV 文件,其中包含大约 900,000 个产品列表。每天只有一小部分文件更改,可能不到 0.5%,而且实际上只是添加或删除的产品,而不是修改。我们需要向我们的合作伙伴展示产品列表。

让事情变得更复杂的是,我们的合作伙伴只能看到其邮政编码半径 30-500 英里范围内的产品列表。每个产品列表行都有一个产品实际半径的字段(有些只有 30,有些是 500,有些是 100,等等。500 是最大值)。给定邮政编码的合作伙伴可能只有 20 个左右的结果,这意味着将有大量未使用的数据。我们无法提前知道所有合作伙伴的邮政编码。

我们必须考虑性能,所以我不确定最好的方法是什么。

我是否应该有两个数据库 - 一个包含邮政编码和纬度/经度,并使用 Haversine 公式计算距离……另一个是实际产品数据库……然后我该怎么办?返回给定半径内的所有邮政编码并在产品数据库中查找匹配项?对于 500 英里的半径,这将是大量的邮政编码。或者写一个MySQL函数?

我们可以使用 Amazon SimpleDB 来存储数据库……但我仍然遇到邮政编码问题。我可以像亚马逊所说的那样创建两个“域”,一个用于产品,一个用于邮政编码?不过,我认为您不能跨多个 SimpleDB 域进行查询。至少,我在他们的文档中没有看到任何地方。

我完全愿意接受其他一些解决方案。它不必是 PHP/MySQL 或 SimpleDB。请记住,我们的专用服务器是 2 GB 的 P4。我们可以升级 RAM,只是我们不能为此投入大量的处理能力。甚至每晚都在 VPS 上存储和处理数据库,如果 VPS 在处理 1.2 gb CSV 时速度慢得无法忍受,这不会是一个问题。我们甚至可以在台式计算机上离线处理文件,然后每天远程更新数据库……除此之外,我仍然遇到需要交叉引用的邮政编码和产品列表的问题。

【问题讨论】:

  • 你应该降低你的文字墙。现在还不清楚您的问题是什么以及您想要实现什么
  • 我建议你问问他们是否有可能获得差异提要,而不是完整提要。这可能会减少工作量。这可能是他们可以轻松完成的事情。
  • 问题是如何在只有 Pentium 4 和 2 GB RAM 的服务器上存储 900,000 条必须通过邮政编码半径交叉引用的记录。我是升级它并尝试完全在 MySQL 中执行此操作,还是使用 Amazon SimpleDB?如果我在 MySQL 中执行此操作,那么在第二个数据库中考虑邮政编码接近度的最佳方法是什么,请记住,我不能只返回 500 英里半径内的所有邮政编码而不会受到性能影响?还是完全有其他解决方案?
  • @Phil:编辑你的第一篇文章。开始降低它。不要发布更多的文字墙

标签: php mysql database amazon-simpledb proximity


【解决方案1】:

您可能想查看 PostgreSQL 和 Postgis。它具有与 MySQL spacial indexing 相似的功能,无需使用 MyISAM(根据我的经验,与 InnoDB 相比,MyISAM 更容易损坏)。

尤其是 Postgres 9.1,它允许使用 GIST 索引进行k-nearest neighbour search 查询。

【讨论】:

  • MySQL(至少我拥有的版本:5.5.13)也支持 InnoDB。
  • @John:就我阅读文档而言,空间功能存在于所有表中,但索引(包括在 5.5 中)仅适用于 MyISAM。 (这很像全文索引。)
  • @yes:不是全文索引。想想看,我也不确定它是否支持运营商,但如果它不支持,我会感到惊讶。
【解决方案2】:

嗯,这确实是一个有趣的问题。

这似乎实际上是两个问题,一个是您应该如何索引数据库,第二个是您如何使其保持最新。第一个您可以按照您的描述实现,但规范化可能会或可能不会成为问题,具体取决于您存储邮政编码的方式。这主要取决于您的数据是什么样的。

至于第二个,这更像是我的专业领域。您可以让您的客户按当前状态将 csv 上传给您,保留昨天的副本并通过 diff 实用程序运行它,或者您可以利用 Perl、PHP、Python、Bash 或您拥有的任何其他工具来找到已更改的行。将它们传递到将更新您的数据库的第二个块中。我已经与客户处理过这方面的问题,编写脚本往往是最好的选择。如果您需要帮助组织始终可用的脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多