PDO / PHP / MySQL 中的性能:事务与直接执行

发布于 2024-08-04 18:26:45 字数 118 浏览 5 评论 0原文

我正在循环访问多个值(例如 1 到 100)并在循环内执行准备好的语句。

与循环内直接执行相比,使用事务(循环结束后提交)是否有优势?

这些值并不相互依赖,因此从这个角度来看不需要进行交易。

I am looping through a number of values (1 to 100 for example) and executing a prepared statement inside the loop.

Is there and advantage to using a transaction - committing after the loop ends - compared to a direct execution inside the loop?

The values are not dependant on each other so a transaction is not needed from that point of view.

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

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

发布评论

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

评论(3

弥枳 2024-08-11 18:26:45

如果您的查询是 INSERT,则页面 7.2.19。 MySQL 手册的 INSERT 语句的速度提供了两个有趣的信息,具体取决于您是否使用事务引擎:

当使用非事务引擎时:

加速 INSERT 操作
使用多个语句执行
非事务表,锁定您的
表。

这有利于性能,因为
索引缓冲区仅刷新到磁盘
一次,在所有 INSERT 语句都完成之后
完全的。通常情况下,会有如
许多索引缓冲区刷新
INSERT 语句。显式锁定
如果可以的话,不需要声明
使用单个 INSERT 插入所有行。

并且,使用事务引擎:

为了获得更快的插入速度
事务表,你应该使用
开始事务并提交
锁表。

所以我猜测使用事务可能是一个好主意 - 但我认为这可能取决于服务器上的负载,以及是否有多个用途同时使用同一个表,以及所有这些......

还有更多我链接到的页面上有信息,所以请不要犹豫,阅读它;-)

而且,如果您正在执行 更新语句

获得快速更新的另一种方法是
延迟更新然后进行多次更新
稍后连续。表演多个
一起更新比
如果您锁定,则一次执行一个
表。

所以,我猜对于插入来说也可以这样说。

顺便说一句:可以肯定的是,您可以尝试这两种解决方案,并使用 microtime 对它们进行基准测试,例如,在 PHP 方面;-)

If your queries are INSERTs, the page 7.2.19. Speed of INSERT Statements of the MySQL manual gives two interesting informations, depending on whether your are using a transactionnal engine or not :

When using a non-transactionnal engine :

To speed up INSERT operations that are
performed with multiple statements for
nontransactional tables, lock your
tables.

This benefits performance because the
index buffer is flushed to disk only
once, after all INSERT statements have
completed. Normally, there would be as
many index buffer flushes as there are
INSERT statements. Explicit locking
statements are not needed if you can
insert all rows with a single INSERT.

And, with a transactionnal engine :

To obtain faster insertions for
transactional tables, you should use
START TRANSACTION and COMMIT instead
of LOCK TABLES.

So I am guessing using transactions might be a good idea -- but I suppose that could depend on the load on your server, and whether there are multiple uses using the same table at the same moment, and all that...

There are more informations on the page I linked to, so don't hesitate to read it ;-)

And, if you are doing update statements :

Another way to get fast updates is to
delay updates and then do many updates
in a row later. Performing multiple
updates together is much quicker than
doing one at a time if you lock the
table.

So, I'm guessing the same can be said than for inserts.

BTW : to be sure, you can try both solutions, benchmarking them with microtime, on the PHP side, for instance ;-)

小巷里的女流氓 2024-08-11 18:26:45

为了更快地完成所有插入,您可以一次完成所有插入,或者将它们分组在一起,也许一次 5 或 10 个,就好像一个插入失败了整个批次一样。

http://www.desilva.biz/mysql/insert.html

事务将减慢你的速度,所以如果你不需要它,就不要使用它。

即使您进行了批量插入,准备好的语句也是一个不错的选择,因为您不必每次都继续构建查询。

For a faster time you could do all the inserts in one shot, or group them together, perhaps 5 or 10 at a time, as if one insert fails the entire batch will.

http://www.desilva.biz/mysql/insert.html

A transaction will slow you down, so if you don't need it then don't use it.

A prepared statement would be a good choice though even if you did batch inserts, as you don't have to keep building up the query each time.

暮光沉寂 2024-08-11 18:26:45

当我必须实现 CSV 文件(可能很长)数据导入时,我遇到了同样的问题(我知道你可以使用 LOAD DATA INFILE 语法,但我必须在插入之前对我的字段进行一些处理)。

所以我用事务和大约 15k 行的文件进行了实验。结果是,如果我将所有记录插入一个唯一的事务中,则只需要几秒钟,并且受 CPU 限制。如果我根本不使用任何事务,则需要几分钟并且它是 IO 限制的。
通过每 N 行提交一次,我得到了中间结果。

I faced the same question when I had to implement a CSV file (possibly quite long) data import (I know you can use the LOAD DATA INFILE syntax for that but I had to apply some processing on my fields before insertion).

So I made an experiment with transactions and a file with about 15k rows. The result is that if I insert all records inside one unique transaction, it takes only a few seconds and it's cpu bound. If I don't use any transaction at all, it takes several minutes and it's IO bounded.
By committing every N rows, I got intermediate results.

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