面试题答案
一键面试事务日志策略优化思路
- 减少日志写入频率:由于闪存的随机读写性能较好,可适当增大事务日志缓存,减少日志刷盘次数。
- 异步刷盘:让日志刷盘操作尽可能异步进行,避免阻塞事务提交。
涉及MySQL参数配置
- innodb_log_buffer_size:该参数设置InnoDB存储引擎的日志缓冲区大小。适当增大此值,如设置为16M - 64M(
innodb_log_buffer_size = 32M
),可减少日志写入磁盘的频率,提升事务处理性能。 - innodb_flush_log_at_trx_commit:此参数控制事务提交时日志的刷盘策略。有三个取值:
- 0:每秒将log buffer中的数据写入日志文件,并调用fsync() 刷新到磁盘。这种方式性能最高,但在系统崩溃时可能丢失1秒的数据。
- 1(默认值):每次事务提交时,将log buffer中的数据写入日志文件,并调用fsync() 刷新到磁盘,保证事务持久性,但性能相对较低。
- 2:每次事务提交时,将log buffer中的数据写入日志文件,但每秒才调用fsync() 刷新到磁盘。性能介于0和1之间,系统崩溃时可能丢失1秒的数据。对于闪存存储,可设置为2(
innodb_flush_log_at_trx_commit = 2
)以平衡性能和数据安全性。
锁机制优化思路
- 优化锁粒度:尽可能使用行级锁而非表级锁,减少锁争用。
- 合理安排事务顺序:按照相同顺序访问资源,避免死锁。
- 调整锁等待超时:适当延长锁等待时间,避免因短暂锁争用导致事务失败。
涉及MySQL参数配置
- innodb_lock_wait_timeout:该参数设置InnoDB事务等待行锁的超时时间,默认值是50秒。如果业务中锁争用较多,可适当增大此值,如设置为120秒(
innodb_lock_wait_timeout = 120
) ,以减少因锁等待超时而回滚的事务数量。 - innodb_row_lock_type:此参数设置InnoDB行锁的类型,有
SHARED
(共享锁)和EXCLUSIVE
(排他锁)。合理设置锁类型可减少锁争用,默认情况下由InnoDB根据操作自动选择合适的锁类型。