MyISAM 表优化建议
- 优点: 使用表级锁定的过程比实现行级锁定和页级锁定所带来的附加成本都要小,锁定本身所消耗的资源也是最少的。
- 缺点: 由于锁定的粒度比较大,造成锁定资源争用的情况会比较多,降低了并发处理能力。
优化逻辑: 由于锁级别不能改变,所以关键要提供并发度,让加锁的时间变短,让可能并发的尽可能并发
- 缩短锁定时间:
- 尽量减少大的复杂query,将复杂query拆分为几个小的query分步执行
- 尽可能建立高效的索引
- 尽量让mysiam存储引擎的表只存放必要的类型,控制字段类型
- 利用合适的机会优化表数据文件
- 分离能并发的操作
- MyISAM表级锁定,而且是读写互相阻塞锁表,但myisam存储引擎有个特性: concurrent insert,可以设置为0 1 2
- -2 无论表数据文件的中间部分是否存在因为删除数据而留下的空间,都允许在数据文件尾部进行并发插入
- -1 但数据文件中间不存在空闲空间,可以在尾部并发插入
- -0 无论中间是否有空闲空间,都不允许并发插入
- 合理利用读写优先级
- mysql的表级锁定对于读写是有不同优先级设定的,默认写优先于读。如果系统读优先于写,那么可以设置low_priority_updates=1,将写的优先级设为最低,如果对写性能要求高,则不设置该值。
concurrent_insert的设置考量:如果数据删除可能性很小,或者对空间不在乎,设置为1 2 都是可以的,如果删除多,建议还是设为1
InnoDB 行锁优化建议
- 优点: 并发高的时候远远优于myisam
- 缺点: 锁定带来的消耗比较大
优化: 利用行级锁 扬长避短
- 让所有检索都通过索引完成,避免升级为表级锁定
- 合理设计索引,尽可能缩小锁定范围
- 尽量减少基于范围的数据检索过滤条件,避免间隙锁带来的负面影响
- 尽量控制事务大小,减少锁定资源量和锁定时间
- 业务允许情况下,尽量使用低级别事务隔离