1

私はmysqlで大規模な結合を行っており、結果のデータに基づいて行動し、それを別のテーブルに書き込んでいます。現在、デフォルトの mysql_store_result を使用していますが、クエリの後の $sth->execute() の実行には約 20 分かかります。一度に 1 行しか操作していないため、mysql_use_result に切り替えたいと考えています。

しかし、ドキュメントのこの部分は私を悩ませます:

この属性は、ドライバーが mysql_store_result ではなく mysql_use_result を使用するように強制します。前者は高速でメモリ消費が少ないですが、他のプロセスをブロックする傾向があります。(これが mysql_store_result がデフォルトである理由です。)

一度に 1 行ずつ処理し、結果を配列に格納しています。500 エントリごとに、別のテーブルに INSERT を実行します。これは、mysql_use_result ループ内から実行しても問題ありませんか? INSERT 用に新しい DB ハンドラを定義してもよろしいですか?

4

1 に答える 1

1

挿入を行うには、別の DB 接続を使用する必要があります。

ただし、引用した注意事項は、特定のクライアントだけでなく、サーバー上のものをブロックすることについて話していると思います。

mysqlのドキュメントはもう少し明確です。

クライアント側で各行に対して多くの処理を行っている場合、またはユーザーが ^S (スクロールを停止) を入力する可能性のある画面に出力が送信される場合は、mysql_use_result() を使用しないでください。これにより、サーバーが拘束され、他のスレッドがデータのフェッチ元のテーブルを更新できなくなります。

(これは言い過ぎだと思います。mysql がおもちゃの SQL 実装に過ぎなかったときに書き戻された可能性があります。)

于 2011-09-01T19:53:26.483 に答える