Perl DBD::mysql 'mysql_use_result'可以在插入另一个表时使用吗?

发布于 2024-12-02 13:15:57 字数 439 浏览 0 评论 0原文

我正在 mysql 中进行大型连接,然后对结果数据进行操作并将其写入另一个表。现在,我使用默认的 mysql_store_result,但是查询后的 $sth->execute() 需要大约 20 分钟才能运行。我想切换到 mysql_use_result 因为我一次只处理一行。

但是,文档的这一部分让我感到困扰:

此属性强制驱动程序使用 mysql_use_result 而不是 mysql_store_result。前者速度更快,内存消耗更少,但往往会阻塞其他进程。 (这就是为什么 mysql_store_result 是默认值。)

我一次只处理一行,然后将结果存储在一个数组中。每 500 个条目,我都会插入到一个单独的表中。在 mysql_use_result 循环中可以这样做吗?如果我为 INSERT 定义一个新的数据库处理程序可以吗?

I'm doing a large join in mysql, and then acting on the resulting data and writing it to another table. Right now, I'm using the default mysql_store_result, but the $sth->execute() after the query takes about 20 minutes to run. I'm wanting to switch over to mysql_use_result since I'm only acting on one row at a time.

But, this part of the documentation bothers me:

This attribute forces the driver to use mysql_use_result rather than mysql_store_result. The former is faster and less memory consuming, but tends to block other processes. (That's why mysql_store_result is the default.)

I'm acting on one row at a time, and then storing the result in an array. Every 500 entries, I do an INSERT into a separate table. Would this be OK to do from within the mysql_use_result loop? Would it be OK to do if I define a new DB handler for the INSERTs?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

べ繥欢鉨o。 2024-12-09 13:15:57

您应该使用单独的数据库连接来执行插入。

但是,我相信您引用的警告注释是在谈论阻止服务器上的事物,而不仅仅是在您的特定客户端上。

mysql 文档 更清晰一些:

如果您在客户端对每一行进行大量处理,或者如果输出发送到用户可以在其中键入 ^S(停止滚动)的屏幕,则不应使用 mysql_use_result()。这会占用服务器并阻止其他线程更新从中获取数据的任何表。

(我认为这是夸大其词,并且可能是在 mysql 更像是一个玩具 SQL 实现时写回来的。)

You should use a separate DB connection to do the inserts.

However, I believe the cautionary note you quote is talking about blocking things on the server, not just on your particular client.

The mysql documentation is a little clearer:

you shouldn't use mysql_use_result() if you are doing a lot of processing for each row on the client side, or if the output is sent to a screen on which the user may type a ^S (stop scroll). This ties up the server and prevent other threads from updating any tables from which the data is being fetched.

(I believe that's an overstatement, and may have been written back when mysql was much more of a toy SQL implementation.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文