第4版 高性能MySQL 第一章 MySQL架构 读书笔记

这本书去年11月出的,今年中文版也出了,并且直接上了微信读书,之后有空就读一读,分享下读书笔记~
原文内容比较充实,建议有时间可以读一下原文.第一章主要是个概览.
MySQL的逻辑架构

第4版 高性能MySQL 第一章 MySQL架构 读书笔记

文章插图
默认情况下,每个客户端连接都会在服务器进程中拥有一个线程,该连接的查询只会在这个单独的线程中执行,该线程驻留在一个内核或者CPU上.线程池
优化器会向存储引擎询问它的一些功能、某个具体操作的成本,以及表数据的统计信息.
query cache 5.7.20弃用 8.0移除考虑应用自己在redis中缓存
并发控制只要有多个查询需要同时修改数据,就会产生并发控制问题
读写锁处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统这两种锁通常被称为共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)
锁的粒度通过降低锁的粒度提高共享资源并发性只锁定包含需要修改的部分数据
表锁table lock最基本 开销最小的锁策略(锁本身的开销 不是指查询/修改性能)
行级锁row lock最大程度支持并发处理 最大的锁开销行级锁是在存储引擎中实现
事务【第4版 高性能MySQL 第一章 MySQL架构 读书笔记】事务就是一组SQL语句,作为一个工作单元以原子方式进行处理要么全部执行成功 要么全部执行失败
ACID
隔离级别这里谈的是ANSI SQL中的定义
  • READ UNCOMMITTED: 未提交读在事务中可以查看其他事务中还没有提交的修改脏读(dirty read): 读取未提交的数据
  • READ COMMITTED: 已提交读大多数数据库系统的默认级别但MySQL不是一个事务可以看到其他事务在它开始之后提交的修改,但在该事务提交之前,其所做的任何修改对其他事务都是不可见的.允许不可重复读(nonrepeatable read) 同一个事务中两次执行相同语句 可能看到不同结果
  • REPEATABLE READ: 可重复读解决了不可重复读无法解决幻读(phantom read) 读取范围数据时 如果另一个事务在该范围插入了新的 再次读取会产生换行(phantom row)InnoDB和XtraDB通过MVCC解决这也是MySQL默认的隔离级别
  • SERIALIZABLE: 可串行化该级别通过强制事务按序执行,使不同事务之间不可能产生冲突,从而解决了前面说的幻读问题.会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题.使用场景较少 除非需要严格确保数据安全 并且接收并发性能下降

第4版 高性能MySQL 第一章 MySQL架构 读书笔记

文章插图
死锁两个或多个事务相互持有和请求相同资源上的锁,产生了循环依赖.当多个事务试图以不同的顺序锁定资源时会导致死锁.
数据库系统实现了各种是说检测和锁超时机制InnoDB目前处理死锁的方式是将持有最少行级排他锁的事务回滚锁的行为和顺序和存储引擎相关
console1:start transaction ;update user set user_name='cc11' where user_id=1;update user set user_name='cc22' where user_id=2;commit ;console2:start transaction ;update user set user_name='cc222' where user_id=2;update user set user_name='cc111' where user_id=1;commit ;单步执行
[40001][1213] Deadlock found when trying to get lock; try restarting transaction事务日志事务日志有助于提高事务的效率.存储引擎只需要更改内存中的数据副本,而不用每次修改磁盘中的表,这会非常快.
事务日志只追加 顺序I/OWAL write-ahead logging 预写日志 修改数据最终要两次磁盘写入
MySQL中的事务描述的是InnoDB引擎中的事务
理解AUTOCOMMIT默认开启 单个语句也是包裹在事务中 自动提交可以通过set autocommit=0/1进行开关用begin或者start transaction来开启事务用commit提交 rollback回滚
有一些命令,当在活动的事务中发出时,会导致MySQL在事务的所有语句执行完毕前提交当前事务比如一些DDL命令 alter table等
可以通过SET TRANSACTION ISOLATION LEVEL改变隔离级别 下一个事务开始时生效
在事务中混合使用存储引擎MySQL的事务由下层存储引擎实现在同一个事务中,混合使用多种存储引擎是不可靠的.
隐式锁定和显式锁定InnoDB使用两阶段锁定协议(two-phase locking protocol).事务执行期间,随时都可以获取锁,但锁只有在提交或回滚后才会释放,并且所有的锁会同时释放.前面描述的锁定机制都是隐式的.InnoDB会根据隔离级别自动处理锁.
显式的(不属于SQL规范)
SELECT … FOR SHARESELECT … FOR UPDATEMySQL还支持LOCK TABLES和UNLOCK TABLES这两个命令在服务器级别实现因为InnoDB支持行级锁 没必要使用

推荐阅读