4

基本的には大きなデータ セットを操作する必要があるため、mysql_unbuffered_query を使用してすべての結果を RAM に読み込まないようにできると考え始めました。

しかし、行をフェッチしている間は、同じテーブルで他のクエリを実行できないことを読みました。テーブルがinnodbの場合、これはまだ真実ですか?

Innodb は mysql_unbuffered_query の実行中に行レベルのロックを使用しますか?

擬似コードは次のとおりです。

$q = mysql_unbuffered_query("SELECT * FROM largeTable");
while($r = fetch($q)) {
 if (some condition)
   mysql_query("UPDATE largeTable SET field = somevalue WHERE id = someid");
}
4

1 に答える 1

1

別のクエリを実行できない理由は、クエリの結果がプリフェッチされておらず、カーソルを扱っているためです。それでも、他のクエリを処理するために別の接続を開くことができます。

MySQL にはいくつかの設定があり、クエリが実行された後に接続が開いたままになる時間に影響を与えることに注意してください。データセットが大きい場合、サーバーはクエリを処理する前に接続を閉じることができます (wait_timeout および net_write_timeout を参照)。 )

代わりに、ループでクエリを実行し、行数を制限し、 をWHERE pk > value ORDER BY pk ASCpkキーvalueとして使用し、前のクエリから取得した最後の値を使用することもできます (ちょうど limit,offset を実装した場合と同様に、パフォーマンスが大幅に低下します)。オフセット)

于 2012-04-21T18:08:07.657 に答える