Php 处理900000条记录数据库和邮政编码的最佳方法?

Php 处理900000条记录数据库和邮政编码的最佳方法?,php,mysql,database,amazon-simpledb,proximity,Php,Mysql,Database,Amazon Simpledb,Proximity,一家与我们有业务往来的公司希望每天为我们提供一个1.2GB的CSV文件,其中包含大约900000个产品列表。每天只有一小部分文件更改,可能少于0.5%,实际上只是添加或删除产品,而不是修改。我们需要向合作伙伴展示产品清单 更复杂的是,我们的合作伙伴应该只能在其邮政编码30-500英里半径范围内看到可用的产品列表。每个产品列表行都有一个字段,用于显示产品的实际半径(有些仅为30,有些为500,有些为100,等等。500是最大值)。给定邮政编码的合作伙伴可能只有20个左右的结果,这意味着将有大量未使

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

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

我们必须考虑表现,所以我不确定最好的方法是什么。< /P> 我应该有两个数据库吗?一个是邮政编码和纬度/经度,使用哈弗森公式计算距离…另一个是实际的产品数据库…然后我该怎么办?返回给定半径内的所有邮政编码,并在产品数据库中查找匹配项?方圆500英里的地方有很多邮政编码。还是写一个MySQL函数

我们可以使用AmazonSimpleDB来存储数据库……但是我仍然有邮政编码的问题。我可以创建两个亚马逊称之为“域名”,一个用于产品,一个用于邮政编码?不过,我认为您不能跨多个SimpleDB域进行查询。至少,我在他们的文档中没有看到这一点


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

您可能需要查看PostgreSQL和。它具有与MySQL相似的特性,不需要使用MyISAM(根据我的经验,MyISAM与InnoDB相比容易损坏)


尤其是Postgres 9.1,它允许使用GIST索引进行查询。

这确实是一个有趣的问题

这似乎实际上有两个问题,一个是如何索引数据库,另一个是如何使数据库保持最新。正如您所描述的,第一个是可以实现的,但是标准化可能是问题,也可能不是问题,这取决于您存储邮政编码的方式。这主要取决于数据的外观


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

你应该放下你的文字墙。现在还不太清楚你的问题是什么,你想得到什么。我建议你问问他们,是否有可能得到差异的反馈,而不是完整的反馈。这可能会减少处理的工作量。这可能是他们可以轻松做到的事情。问题是如何在一台只有2 Gig RAM的奔腾4的服务器上存储900000条必须由邮政编码radius交叉引用的记录。我是升级它并尝试完全在MySQL中实现这一点,还是使用AmazonSimpleDB?如果我在MySQL中这样做,那么考虑到第二个数据库中的邮政编码邻近性的最佳方法是什么,记住我不能只返回500英里半径内的所有邮政编码而不遭受性能影响?还是完全有别的解决办法?@Phil:编辑你的第一篇帖子。开始放低它。不要发布更多的textMySQL墙(至少我的版本是:5.5.13)也支持InnoDB。@约翰:就我阅读文档而言,空间功能存在于所有表中,但索引(包括5.5)仅适用于MyISAM。(这很像全文索引。)@是:不是全文索引。仔细想想,我也不确定它是否支持这个操作符,但如果它不支持,我会感到惊讶。