2012-04-21 14 views
4

基本的にはlargedata setを操作する必要があるので、mysql_unbuffered_queryを使用してすべての結果をRAMにロードしないと考え始めました。大きなデータセット:mysql_unbuffered_query with 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"); 
} 

答えて

1

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

MySQLにはいくつかの設定があり、クエリの実行後に接続が開いている時間に影響します。データセットが大きい場合は、クエリを処理する前にサーバーを閉じることができますWAIT_TIMEOUTとnet_write_timeout)

良い代替行の数を制限し、そしてpkが主キーであるWHERE pk > value ORDER BY pk ASC、およびvalueを使用して、ループ内でクエリを実行することを参照しているかのように(以前のクエリから取得された最後の値あなたはちょうど限界を実装します、オフセットは大きなオフセットで性能が低下します)

関連する問題