1

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

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:

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

4

2 回答 2

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

等等。

于 2012-11-13T01:42:32.253 回答
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

于 2012-11-13T04:29:51.067 回答