2011-04-20 103 views
0

我有一套大约110万个唯一ID,我需要确定哪些数据库中没有对应的记录。这组ID也来自数据库,但不是同一个。我使用的是PHP和MySQL,并且拥有大量内存 - PHP运行在具有15GB内存的服务器上,MySQL运行在拥有7.5GB RAM的自己的服务器上。比较大型MySQL数据集与PHP

一般情况下我简单地装载所有的ID在一个查询,然后用它们用SELECT查询的IN子句做比较,在一杆。

到目前为止,我的尝试已经导致脚本可以接受一个无法忍受的很长一段时间,或者会使CPU到100%。

什么是加载一个大型数据集,做这种比较的最佳方式?

+5

使用左连接而不是in in子句。 – 2011-04-20 20:19:58

+2

你应该配置你的MySQL实例,以便它可以在内存中加载数据集(1.1mil应该容易适应7.5gb的ram),并且按照nick的说法使用左连接而不是不连接。它更高效,查询应该非常快。 – 2011-04-20 20:48:26

回答

3

生成第一个数据库中ID的转储到一个文件中,然后将其重新加载到第二个数据库上的临时表中,并在该临时表和第二个数据库表之间进行连接以标识这些ID没有匹配的记录。生成该列表后,您可以删除临时表。

这样一来,你不是试图用大量的PHP本身数据的工作,所以你不应该有任何内存问题。

1

假设你不能加入的表,因为他们是不一样的DB服务器上,而您的服务器可以处理这个问题,我将与所有的ID从一个数据库,然后通过从的ID循环填充数组其他并使用in_array来查看数组中是否存在每一个。

BTW - 根据this,可以使in_array更有效。