2012-11-13 68 views
1

我正在使用ruby在MySQL數據庫上執行查詢。我在尋找的uid與匹配:大集sql查詢

WHERE uid in #{VERY_LARGE_COMMA_SEPARATED_LIST} 

的VERY_LARGE_COMMA_SEPARATED_LIST超過30,000項

VERY_LARGE_COMMA_SEPARATED_LIST = ' "one","two","three",...,"30k" ' 

,它會導致SQL轉儲錯誤:

Mysql2::Error - MySQL server has gone away: 

有誰知道什麼是去這裏?

+1

有人可以編輯嗎?這裏有什麼問題?你的「大型」數據串來自哪裏?它是一個文本文件,csv文件,還是隻是一個字符串? – bonCodigo

+0

它是一個字符串。我編輯了它 – prostock

+0

*問題中沒有一個問號* David ... http://dev.mysql.com/doc/refman/5.1/en/gone-away.html – oldergod

回答

0

您必須要經過典型的1MB mysql SQL命令緩衝區。

解決您的問題,您應該創建(可能是暫時的)表uids其中只包含UID的,像

CREATE TABLE uids (uid INT NOT NULL PRIMARY KEY); 

(確保指數存在uid)。

然後插入必要的UID爲uids表中幾條語句是這樣的:

INSERT INTO uids (uid) VALUES (1),(5),(10),..; 

最後,運行查詢爲:

WHERE uid IN (SELECT uid FROM uids) 

或加入這樣的:

SELECT m.* 
FROM master m, uids u 
WHERE m.uid = u.uid 
... 

最後,你可能想放棄你的uids表。

編輯:我錯過了你的uid不是整數。只需調整它的定義即可使用VARCHAR

0

這似乎是你的查詢超時或內存不足 - 你看到MySQL日誌中的任何錯誤表明這一點?

我有一種感覺,你超負荷你的服務器。

如果您還有:

where uid in (#{VERY_LARGE_CSV})

編輯: 你可能分裂CSV然後運行是這樣的:

SELECT * from TBL where uid in (#{CSV_SUBSET})t1 
UNION 
SELECT * from TBL where uid in (#{CSV_REMAINDER})t2 

等。

+0

謝謝。是。我想知道是否有推薦的方法來分解大塊查詢成小塊,然後重新組合。 – prostock

+0

這不會幫助,因爲總緩衝區大小將保持大致相同 – mvp

+0

約定 - 我從未說過它會更好,但概念是相同的,以編程方式分割它,並且每次運行會節省一些開銷 - 但真的如果查詢失敗,查詢需要優化,它也可能會失敗。 – Michael