2011-04-20 105 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更有效。