开发者学堂课程【云数据库优化十大典型案例:案例3:锁优化 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/597/detail/8568
案例3:锁优化
内容简介
一.表级锁
二.Metadata lock
三.锁问题最佳实践
一.表级锁
Innodb与Myisam
引擎 |
支持事务 |
并发 |
索引损坏 |
锁级别 |
在线备份 |
Myisam |
不支持 |
查询堵塞更新 |
索引损坏 |
表 |
不支持 |
Innodb |
支持 |
不堵塞 |
不损坏 |
行 |
支持 |
CREATE TABLE `t_myisam`(
`id`int(11) DEFAULT NULL
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
查询堵塞更新
Query|111|User sleep |select id,sleep(100)from t_myisam |
Query|108|Waiting for table level lock | update t_myisam set id=2 where id=1|
Query| 3 |Waiting for table level lock | update t_myisam set id=2 where id=1|
解决:
Alter table t_myisam engine=innodb;
二.Metadata lock
DDL操作:alter table t add column gmt_create datetime
数据库连接状态:
Query |6| User sleep |select id ,sleep(50) from t
Query |4|Waiting for table metadata lock |alter table t add column gmt_create da
Query |2| Waiting for table metadata lock |select*from t where id=1
Query |1| Waiting for table metadata lock |select*from t where id=2
Query |1| Waiting for table metadata lock |update t set id =2 where id=1
Tips:DDL 过程中注意数据库中大长事务,大查询
三.锁问题最佳实践
①设计开发阶段
1.避免使用 myisam 存储引擎,改用 innodb 引擎
2.避免大事务,长事务导致事务在数据库中的运行时间加长(可能会导致表上操作无法完成)
3.选择升级到 MySQL5.6 版本,支持 online ddl
②管理运维阶段
1.在业务低峰期执行上述操作,比如创建索引,添加字段;
2.在结构变更前,观察数据库中是否存在长 SQL,大事务;
3结构变更期间,监控数据库的线程状态是否存在 lock wait;
4.Apsara D B支持在 DDL 变更中加入 wait timeout;