高性能 Mysql 的读书笔记。因为这本书写的实在是太好了,即使只是随便翻一下都让人受用无穷。于是写下读书笔记加深印象,也方便没空读这本书的人粗略读一下这本书。
Mysql 的并发控制
读写锁
因为并发的读取数据并不会出现问题,但是并发的读写或者并发写写操作就会出现问题了,所以在并发处理的时候如果将读操作也加上锁那么就浪费了资源。
这时候就引入了共享锁和排他锁来解决这个问题。它们也叫做读锁和写锁。相当于 Java 并发包中的 ReadWriteLock。
锁粒度
尽量减小锁的粒度锁定有利于增加并发量,但是加锁的粒度越小,加锁开销越大。
行锁:并发粒度小,加锁开销大,最大程度增加了并发处理
表锁:锁定整张表,加锁开销小
事务
事务的特性
事务有 ACID 几个特性
Atomicity 原子性:
原子性任务是一个独立的操作单元,一个事务要么全部提交成功,要么全部失败回滚。
Consistency 一致性:
数据库总是从一个一致性的状态转移到另外一个一致性的状态。当事务失败的时候它所作出的修改也不会保存到数据库中。
Isolation 隔离性:
一个事务所做的修改在提交前对其他的事务是不可见的。
Durability 耐久性:
一旦一个事务提交,所做的修改就会永久保存到数据库中。
隔离级别
SQL 定义了四种隔离级别,每一种级别规定了一个事务中所做的修改,哪些修改在事务内和事务间是可见的。
级别低的可以执行更高的并发,系统开销也低。
脏读:一个事务读到了其他事务未提交的数据
不可重复读:事务 A 第一次读取到 row1,然后有事务 B 提交修改后,事务 A 再次查询到这一行,但是内容不一样
幻读:事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到两行记录row1和row2。
READ UNCOMITED(未提交读)
在这个级别中,事务的修改即使没有提交对其他的事务也是可见的。这样会导致脏读问题,从性能上来说,它也不会比其他的好很多,所以一般不用
READ COMMITED(提交读)
大多数数据库默认隔离级别都是这个(Mysql 不是),一个事务开始的时候只能看见已经提交过的事务。这个级别也叫做不可重复读。
REPEATABLE READ(可重复读)
它是 Mysql 的默认事务隔离级别。这个级别保证了同一个事务中多次读取同样的记录结果是一致的,但是解决不了幻读问题。
SERIALIZABLE(可串行化)
这个事务执行级别最高,避免了幻读的问题,在每一个数据上都加上锁,可能会导致大量的锁争用的问题。这个级别也很少用。
MYSQL 相关特性
Mysql 默认使用的是自动提交,如果不显式地开始一个事务,所有的查询都会被当做一个事务提交。
可以通过设置 AUTOCOMMIT 变量来启动或者禁用自动提交。
当然对于 MyISAM 这类没有事务概念的引擎,这个是一直启用的。
Mysql 中的事务型存储引擎都不是简单的行锁,它们一般都实现了多版本的并发控制 MVCC,可以简单的认为 MVCC 是行锁的一个变种。
如何选择合适的存储引擎
其实如果根据书上的话来总结,就是这一幅图