处理900,000记录数据库和邮政编码的最佳方式?

时间:2011-06-07 21:19:55

标签: php mysql database amazon-simpledb proximity

我们与之合作的公司希望每天为我们提供一个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时速度难以忍受,则不会出现问题。我们甚至可以在台式计算机上离线处理文件,然后每天远程更新数据库......除此之外我仍然有邮政编码和产品列表需要交叉引用的问题。

2 个答案:

答案 0 :(得分:2)

您可能希望了解PostgreSQL和Postgis。它具有与MySQL spacial indexing功能类似的功能,无需使用MyISAM(根据我的经验,与InnoDB相比,它往往会变得腐败)。

特别适用于Postgres 9.1,它允许使用GIST索引进行k-nearest neighbour search查询。

答案 1 :(得分:1)

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

这看起来实际上是两个问题,一个应该如何索引数据库,第二个是如何让它保持最新。您可以按照自己的描述实现第一个,但规范化可能会或可能不会成为问题,具体取决于您存储邮政编码的方式。这主要归结为您的数据。

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