高性能MySQL读书笔记——开天辟地

引言

本书学习目标是熟知并能够给同事讲解数据库表的设计、索引的设计、常见的查询优化。

第一章

MySQL服务器的架构图
高性能MySQL读书笔记——开天辟地_第1张图片
Mysql服务器是三层架构。

  • 第一层是连接池,授权认证,安全等
  • 第二层是Mysql比较有意思的部分。大多数Mysql的核心服务功能都在这一层,包括查询解析,分析、优化、缓存以及所有的内置函数,所有的跨存储引擎的功能都在这一层实现:存储过程,触发器,视图。
  • 第三层包含了存储引擎。存储引擎负责Mysql中数据的存储和读取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异。存储引擎只是响应上层服务器的请求。
    注:Mysql在查询解析,分析优化阶段是会请求存储引擎获取数据的分布,辅助生成最优的执行计划

各个阶段的主要工作内容

连接管理和安全性

客户端的每个连接都会在服务器进程中拥有一个线程,这个连接的查询在这个单独的线程内完成。
使用连接池来管理线程。
对用户名和密码进行认证,证书认证,并验证是否具有执行某个特定查询的权限。

优化与执行

解析查询,抽象成解析树。进行各种优化(重写查询,决定表的读取顺序,以及选择合适的索引等)。可以通过hint提示优化器,影响决策过程。也可以使用explain查看优化过程。优化器的优化查询是会受存储引擎影响的。
命中了查询缓存,就不必进行查询解析,优化和执行的整个过程。

并发控制

共享锁:共享锁之间互相不阻塞,支持并发读取同一资源,共享锁和排他锁之间会互相阻塞
排他锁:排他锁之间互相阻塞,与共享锁页互相阻塞。只支持获取到资源锁的用户读取。

锁策略就是在锁的开销(锁管理,加锁和释放锁)和数据的安全性之间需求平衡。每种mysql的引擎都有自己的锁策略和锁粒度。
最重要的锁粒度:
表锁
优点:开销小,管理方便,实现简单
缺点:并发度低

行锁
优点:开销比表锁大,管理复杂,实现复杂
缺点:并发度高

行级锁在存储引擎实现。

事务

事务由存储引擎实现。
事务就是一组原子性的sql查询,或者说是一个独立的单元。
原子性:事务是不借分割的最小执行单位,要么成功,要么失败回滚。
一致性:事务执行完后,数据库总是从一个状态到另一个状态。
隔离性:事务之间是不可见的,通过并发控制,行多版本控制。
持久性:事务提交后,数据不会丢失,永久有效。
原子性通过undo log保证。
一致性通过redo 和undo保证
隔离性通过锁和undo实现的行多版本控制保证。
持久性通过redo保证。

死锁
innodb会检测死锁的循环依赖。回滚持有最少行级排他锁的事务。

事务日志
事务日志可以帮助提高事务的效率。存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中。事务日志是在一小块磁盘区域的顺序写,避免每次修改数据到磁盘的随机io,大大提高了事务的效率。
称为预写式日志,修改数据需要写两次磁盘。

在事务中混合使用存储引擎
每张表都可以指定存储引擎,在事务使用多张表,表是由不同存储引擎管理的,那么事务回滚时,非事务型存储引擎管理的表将不会得到回滚。

隐式和显式锁定
innodb采用的是两阶段锁定协议。在事务执行过程中,随时都可以执行锁定,锁只有在执行commit或者rollback的时候才会释放,并且所有锁是在同一时刻被释放。锁定都是隐士锁定,innodb会根据隔离级别在需要的时候加锁。
innodb也支持显示锁定,这些语句不属于sql规范。 select 。。。 lock in share model ,select 。。。 for update。

lock tables tb [read | write]和unlock tables

多版本并发控制

MVCC的实现,是通过保存数据在某个时间点的快照实现的。有乐观并发控制和悲观并发控制两种。
InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期时间(或删除时间),确切的说保存的是系统版本号。每开始一个新的事物,系统版本号都会自动递增,事物开始时刻的系统版本号会作为事务的版本号。

在RR隔离级别下,MVCC具体是怎么操作的:
Select
a.InnoDB只查找创建版本号小于当前事务版本号数据,或者是本事务修改或新增的数据。
b.只查询寻删除版本号大于本事务版本号
Insert
InnoDB为新插入的每一行保存当前系统版本号作为行版本号
Delete
InnoDB为删除的每一行保存当前系统版本号作为行删除标识。
Update
InnoDB为原来的行保存行删除标识,新增一行记录创建版本号为本事务的行版本号。

多版本并发控制在RR和RC的隔离级别下工作。其他隔离级别不兼容。区别在于RC读取的行最新版本记录,RR的读取规则在上面。

普通查询都是快照读,符合MVCC的逻辑。
当前读使用锁来解决脏读,不可重复读和幻读问题。

Mysql的存储引擎

mysql5.1版本之前默认的存储引擎是MyISAM,之后便是Innodb

MyISAM

加锁与并发
表锁级别的并发,但是可以并发插入:表的查询和插入可以并发进行

修复
支持修复因为异常原因宕机导致的不完整数据(删除)

索引特性
支持对Blob和text等长字段的前500个字符创建索引

压缩表
压缩表不能修改,但是会大大减少磁盘IO占用,提示查询性能。

临时表

sql中使用的临时表就是memory引擎的表

InnoDB

hash索引,支持事务,行锁,崩溃自动恢复,聚簇索引

你可能感兴趣的:(mysql)