1

私はMySQLデータベースでクエリを実行するためにrubyを使用しています。私は次のような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のmysqlSQLコマンドバッファを超えている必要があります。

問題を解決するにuidsは、uidだけを含む(おそらく一時的な)テーブルを作成する必要があります。

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

(のインデックスが存在することを確認してuidください)。

uids次に、次のようないくつかのステートメントで、必要なuidをテーブルに挿入します。

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 に答える