8.5.2 Optimizing InnoDB Transaction Management

8.5.2 Optimizing InnoDB Transaction Management

优化InnoDB 事务处理,找到理想的平衡在性能负载和你的服务器的负载。

比如,一个应用可能遇到性能问题如果它每秒提交了数千次,和不同的性能问题如果它每2-3个小时提交。

默认的MySQL 设置为AUTOCOMMIT=1 ,可以强加性能限制在一个繁忙的数据库上.

在实践中,把几个相关的DML操作到一个单独的事务,通过执行SET AUTOCOMMIT=0

或者START TRANSACTION 豫剧, 跟着一个COMMIT 语句在做所有的改变后。

InnoDB 必须 flush 日志到磁盘在每次事务提交,如果事务修改了数据库。

当每个改变后面跟着一个commit(如默认的autoCommit设置),存储设备的I/O 吞吐量。

另外, 对于交易只有一个单独的SELECT 语句, 打开AUTOCOMMIT 帮助InnoDB 来重新组织read-only 事务

和 优化它们。See Section 8.5.3, “Optimizing InnoDB Read-Only Transactions” for requirements.

避免性能回滚在每次inserting, updating, or deleting大量记录。

如果一个大事务是弄慢了server性能, 回滚会造成更严重的问题,

可能几倍于原始的DML操作。 kill数据库进程没有帮助, 因为回滚在数据库启动时又运行

尽量减少这个问题发生的几率:

增加 buffer pool 的大小,可以让所有的DML 操作可以被cached 相比立即写入到磁盘。

Set innodb_change_buffering=all 所有的更新和删除操作是被缓存除了INSERT操作

考虑执行COMMIT 语句定期的在大的DML操作

一旦失控的回滚操作发生,增加buffer pool,rollback 变的CPU-bound和运行的很快,

或者kill server 和重启带innodb_force_recovery=3,as explained in Section 14.15.1, “The InnoDB Recovery Process”

.

这个问题在在MySQL 5.5和更高的版本变的不重要,因为默认的设置innodb_change_buffering=all

允许耿勋和删除操作 被cache在内存里,让它们快速执行在第一个地方,

如果需要 也可以快速回滚。确保使用这个参数设置在每个服务器上,处理长的事务有很多的插入,更新和删除

如果你能承受 最后提交的一些事务的丢失如果一个crash 发生,

你可以设置innodb_flush_log_at_trx_commit parameter to 0,默认为1
mysql> show variables like ‘%innodb_flush_log_at_trx_commit%’;
+——————————–+——-+
| Variable_name | Value |
+——————————–+——-+
| innodb_flush_log_at_trx_commit | 1 |
+——————————–+——-+
1 row in set (0.00 sec)

InnoDB 尝试每秒flush 日志,尽管flush不是强制的。

设置innodb_support_xa to 0,会降低磁盘flush的次数 由于同步磁盘和binary log.

当修改或者删除记录,记录和相关的undo logs 不是立即物理删除的,

或者甚至在事务提交后。 undo里老的数据是被保留的直到事务很早开始的或者并发结束的,

因此那些事务可以访问先前的状态或者修改或者删除的记录。

因此,长时间运行的事务可以防止InnoDB 清理数据,被不同会话修改

当记录被修改或者删除在一个长时间运行的事务里, 其他的会话使用

READ COMMITTED and REPEATABLE READ 隔离级别需要做更多的工作来重建老的数据 如果它们读取相同的记录。

当一个长时间运行的事务修改一个表,查询针对的表从其他会话不使用覆盖索引技术。

查询通常检索所有的数据从一个 secondary index, 代替的是寻找相应的值从表数据。

原文地址:https://www.cnblogs.com/hzcya1995/p/13351263.html