高性能MySQL读书笔记
Chapter1
MySQL的架构分为三层:第一层是客户端,通过网络连接服务端获取对应的数据。第二层是它的核心架构设计包括解析器,查询缓存,优化器。第三层是存储引擎,引擎之间不会互相通信,通过 API 接口向上层暴露端口来进行数据的操作。
在MySQL中的并发控制通过两种类型的锁来进行解决:第一种是共享锁(读锁);第二种是排他锁(写锁)。MySQL中锁是一种资源,所以针对不同的应用场景包括了两种比较重要的锁策略模式——表锁和行锁。这两种策略前者开销小,但是并发性能不如后者。并且行锁只在存储引擎层实现了,而表锁在服务器层和存储引擎层都实现了。
事务是一组原子性SQL的操作,要么全部成功,要么全部失败。事务处理系统包括 ACID 表示原子型(atomicity)、一致性(consistency)、隔离型(isolation)、持久性(durability)。
原子性表示一系列 SQL 操作必须看成一个整体,要么全部成功,要么全部失败。一致性表示在执行事务时发生了意外情况,操作不会更新到数据库中。
在事务并发操作可能出现下面的问题:
- 脏读(读取了其他事务未提交的数据)
- 不可重复读(多次读取同一个事务,数据内容不一致)
- 幻读(多次读取同一个事务,数据总量不一致)
不可重复读和幻读的区域:
- 不可重复读是读取了其他事务更改的数据,针对 update 操作。(使用行级锁解决)
- 幻读是读取了其他事务新增或减少的数据,针对 insert 和 delete 操作。(使用表锁解决)
隔离性中包括了不同的事务隔离级别:
未提交读:表示当前事务中的修改即使没提交,对其他事务也是可见的,其他事务可以读取未提交的数据,表示脏读。(实际应用中很少用到该隔离级别)
提交读:(大部分数据库的事务隔离级别都是默认该级别但是MySQL不是)一个事务从开始到提交前对其他事务都是不可见的也被称为不可重复读,因为两次同样的查询操作可能得到不同的查询结果。该事务隔离级别会导致不可重复读问题。
可重复读:解决了不可重复读问题,保证了在同一个事务中多次读取同样的记录是一样的。但是不能避免幻读。 MySQL的存储引擎 InnoDB 和 XtraDB 通过多版本控制 Multiversion Concurrency Control 解决了幻读的问题。(MySQL事务的默认隔离级别)
可串行化:事务的最高隔离级别,强制事务的串行执行,避免了幻读问题。
事务执行过程中有可能会因为资源竞争的问题发生死锁,每个引擎的处理方式不同 InnoDB 的处理方式是将事务超时后将持有最少行锁的事务进行回滚,死锁发生后只需要将发生死锁的事务回滚即可。
事务日志是可以帮助提交事务的效率,它是将数据的修改进行拷贝记录到事务日志然后在将其持久化到磁盘顺序 io上,所以相对于之前更快。而数据在后台慢慢持久化到磁盘中。
MySQL中提供了事务性的存储引擎:InnoDB 和 NDB Cluster 还有一些第三方存储引擎页支持事务 XtraDB 和 PBXT。MySQL默认采用自动提交模式,也就是没有显示采用事务将自动进行提交。
Chapter5
简介
索引可以类比一本书的目录,为了找到特定的章节可以先查看书的目录。在MySQL中,存储引擎使用相同的方式使用索引,现在索引出找到对应的值,然后根据匹配的索引找到对应的数据行。在数据量较大时,利用这种方式,可以让查询效率提高很多的数量级。
索引类型
索引是在存储引擎层实现的,不同的存储引擎的索引类型一定相同,并且相同类型索引实现也不一定相同。