[英]MySQL/MariaDB - Setting global variable “innodb_flush_log_at_trx_commit = 2” doesn't affect speed
我已将 innodb_flush_log_at_trx_commit 的全局变量设置为 2,但是当我运行命令ab.exe -n 200 -c 200 -s 9999 http://127.0.0.1/index.php
之前和之后的速度没有区别。
文件里面的查询是用 php/laravel 写的:
$status = ['enable', 'disable'];
try {
\DB::beginTransaction();
for($p = 1; $p <= 1000; $p++) {
$price = mt_rand(1000, 5000);
CarPrice::create([
'car_id' => $p,
'amount' => $price,
'status' => $status[rand(0, 1)],
]);
}
\DB::commit();
} catch (\Exception $exception) {
\DB::rollback();
die('Err!');
}
innodb_flush_log_at_trx_commit
时,我都会重新启动 Apache 和 MariaDB。您可能需要每秒COMMIT
超过 100 个事务才能看到任何差异。 那是硬盘驱动器; 如果你有 SDD,它可能是 1000。
你在做以下事情吗?
START TRANSACTION;
INSERT
INSERT
...
INSERT -- 1000 1-row inserts in a single connection?
COMMIT; -- This is where that setting makes a difference.
COMMIT
占总数的比例很小,很难衡量。
真正的加速是这样做的:
START TRANSACTION;
INSERT ... VALUES
( row ),
( row ),
...
( row ); -- one 1000-row insert?
COMMIT; -- This is where that setting makes a difference.
但是,这将需要更改您的应用程序代码。
潜在问题:您需要为每一行获取Last_insert_id()
吗?
PS:这将展示与innodb_flush_log_at_trx_commit
的差异; 它会慢得多:
START TRANSACTION;
INSERT
COMMIT;
START TRANSACTION;
INSERT
COMMIT;
... -- 1000 1-row inserts in a single connection
START TRANSACTION;
INSERT
COMMIT; -- after each row inserted!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.