大集sql查询

时间:2012-11-13 01:28:11

标签: mysql ruby

我正在使用ruby来对MySQL数据库执行查询。我正在寻找uids的匹配:

WHERE uid in #{VERY_LARGE_COMMA_SEPARATED_LIST}

VERY_LARGE_COMMA_SEPARATED_LIST超过30k条目

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

它会导致sql转储错误:

Mysql2::Error - MySQL server has gone away:

有谁知道这里发生了什么?

2 个答案:

答案 0 :(得分: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

等等。

答案 1 :(得分: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