Mysql实战45讲问答

如何避免长事务对业务的影响? 这个问题,我们可以从应用开发端和数据库端来看。 首先,从应用开发端来看: 1. …

  • 如何避免长事务对业务的影响?

这个问题,我们可以从应用开发端和数据库端来看。

首先,从应用开发端来看:

1. 确认是否使用了 set autocommit=0。这个确认工作可以在测试环境中开展,把MySQL 的 general_log 开起来,然后随便跑一个业务逻辑,通过 general_log 的日志来确认。一般框架如果会设置这个值,也就会提供参数来控制行为,你的目标就是把它改成 1。

2. 确认是否有不必要的只读事务。有些框架会习惯不管什么语句先用 begin/commit 框起来。我见过有些是业务并没有这个需要,但是也把好几个 select 语句放到了事务中。这种只读事务可以去掉。

3. 业务连接数据库的时候,根据业务本身的预估,通过 SET MAX_EXECUTION_TIME 命令,来控制每个语句执行的最长时间,避免单个语句意外执行太长时间。(为什么会意外?在后续的文章中会提到这类案例)其次,

从数据库端来看:

1. 监控 information_schema.Innodb_trx 表,设置长事务阈值,超过就报警 / 或者 kill;

2. Percona 的 pt-kill 这个工具不错,推荐使用;

3. 在业务功能测试阶段要求输出所有的 general_log,分析日志行为提前发现问题;

4. 如果使用的是 MySQL 5.6 或者更新版本,把 innodb_undo_tablespaces 设置成 2(或更大的值)。如果真的出现大事务导致回滚段过大,这样设置后清理起来更方便。

  • 通过两个 alter 语句重建索引 k,以及通过两个 alter 语句重建主键索引是否合理。

我们文章里面有提到,索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,也就是索引更紧凑、更省空间。这道题目,我给你的“参考答案”是:重建索引 k 的做法是合理的,可以达到省空间的目的。但是,重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。这两个语句,你可以用这个语句代替 : alter table T engine=InnoDB。

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/7680.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部