我正在使用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:
有谁知道这里发生了什么?
答案 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
。