mysql概览
一些基本问题
事务
事务相关基本问题
- 脏读
- 丢失修改
- 不可重复读
- 幻读
不可重复读 vs 幻读
不可重复读偏向于修改数据导致两次读取不一致
幻读重点在于新增/删除导致两次读取的结果集不一致
锁
乐观锁 vs 悲观锁
乐观锁
做乐观的假设,数据不会被并发修改,不上锁,在更新的时候判断是否被更新,通过mvcc或者cas实现,适用于多读的应用类型,可以提高吞吐量,数据库的write_condition机制
是一种乐观锁
乐观锁的问题
- ABA问题
- 激烈竞争时循环开销大
事务隔离级别
SQL标准级别
- read-uncommitted
允许读尚未提交的数据变更,可能导致脏读/不可重复读/幻读 - read-committed
允许读取并发事务已经提交的数据,有不可重复读/幻读问题 - repeatable-read
对同一字段多次读取结果是一致的,存在幻读问题 - serializable
最高隔离级别
InnoDB
事务隔离级别:默认repeatable-read,查看命令select @@tx_isolation
InnoDB采用Next-Key Lock锁算法,避免幻读问题
在分布式事务中,一般会使用serializable隔离级别
InnoDB
锁算法
- Record lock: 行记录加锁
- Gap lock: 间隙锁,锁定一个范围,不包括记录本身
- Next-key lock: record lock + gap lock,锁定一个范围,包括本身
- 行查询 使用next-key lock
- next-key lock为了解决
幻读
问题- 查询的索引为唯一索引时,next-key lock -> record lock
- gap lock设计目的是为了阻止多个事务将记录插入到同一范围内,从而导致幻读问题
一些命令
索引相关
- 添加主键
alter table 'table_name' add primary key ('column')
- 添加唯一索引
alter table 'table name' add unique('column')
- 添加索引
alter table 'table_name' add index index_name('column')
- 添加全文索引
alter table 'table_name' add fulltext('column')
- 添加组合索引
alter table 'table_name' add index index_name('column1', 'column2'...)
Q&A
Q: 存储引擎是表级还是数据库级?
A: 表级别,create table
命令可以通过参数engine
来指定存储引擎
Q: MyISAM vs InnoDB区别
A: MyISAM是mysql5.5
之前版本的默认存储引擎,之后版本为InnoDB
- MyISAM只有表级锁,InnoDB支持行级锁和表级锁
- MyISAM强调性能,不提供事务支持,InnoDB提供事务、外键等数据库高级功能支持
- MyISAM不支持外键,InnoDB支持
- InnoDB支持mvcc
网友评论