版次: 2013年5月第1版
印次: 2020年11月第34次印刷
1.1 逻辑架构
- MySQL大体分3层架构, 最上层连接客户端, 主要做连接/线程处理;第二层是大多数MySQL的核心功能, 包括查询解析/分析/优化/缓存以及所有的内置函数第三层主要是存储引擎
- MySQL在查询时会使用缓存优化, Page3
1.2 并发控制
- 解决并发问题的经典方法是采用并发控制, 这里用到了读写锁, 也分别称为shared lock(read), 和exclusive lock(write), 读锁可以共享, 而写锁不能(是排他的)
- 锁粒度的问题, 指让锁定对象更有选择性, 锁定部分区域. 所谓的锁策略,就是在锁的开销和数据的安全性质检寻求平衡; 表锁(table lock)是MySQL中最基本的锁策略, 还有行级锁(row lock)可以最大程度地支持并发处理(同时带来了最大的锁开销)
1.3 事务(transaction)
- ACID特性, atomicity, consistency, isolation, durability
- 四个隔离级别, READ UNCOMMITTED(会出现dirty read), READ COMMITED(默认级别, 另称nonrepeatable read), REPEATABLE READ(会产生phantom read), SERIALIZABLE(可串行化, 最高隔离级别)
- 解决幻读(phantom read), 在InnoDB和XtraDB中采用多版本并发控制(MVCC, Multiversion Concurrency Control) 解决, 也可以采用SERIALIZABLE解决
- 多个事务试图以不同顺序锁定资源时, 就可能产生死锁. 为解决死锁, DBMS实现了各种死锁检测和死锁超时机制, 具体见Page9
- 事务日志可以提高效率, 需要写两次磁盘(第一次写在日志上, 第二次是真正将数据记录到数据库文件里)
1.4 多版本并发控制
- 可以认为MVCC是行级锁的一个变种, 在很多情况下避免了加锁操作, 虽然实现机制有所不同, 但大多实现了非阻塞的读操作, 写操作也只锁定必要的行
- MVCC的实现是通过保存数据在某个时间点的快照, 比如InnoDB的MVCC, 是通过在每行记录后面保存两个隐藏的列, 一个保存行的创建时间, 一个保存行的过期时间(或删除时间), 具体见Page13
1.5 MySQL的存储引擎
- 创建表时, MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义, 可以通过
show table status like 'user' \g
来显示表的相关信息, 每个字段对应的解释见page14
- InnoDB是MySQL的默认事务型引擎, 设计用来处理大量的短期事务, 实现了4个标准的隔离级别, 其默认级别是REPEATABLE READ, 并且通过间隙锁(next-key locking) 策略防止幻读的出现. 间隙锁使得InnoDB不仅仅锁定查询涉及的行, 还会对索引中的间隙进行锁定, 以防止幻影行的插入;
- MyISAM在MySQL5.1及以前是默认的存储引擎, 不支持事务和行级锁, 缺陷是崩溃后无法安全恢复. 对于只读数据, 或者表比较小, 可以忍受修复(repair)操作, 依然可以使用MyISAM引擎;
- MyISAM会将表存储在两个文件中, 数据文件(.MYD), 索引文件(.MYI). 特性是对整张表加锁, 可以支持索引, 设定延迟更新索引键(Delayed Key Write), 可以对表压缩(减少空间占用和磁盘IO)
- MySQL有一些内建的其他存储引擎, 详细见page19, 其中个人感觉用到比较多的有CSV引擎和Memory引擎
- 选择合适的引擎很重要, 大多数情况下用InnoDB是没有问题的, 如果选择可以参照Page24
1.6 MySQL Timeline (page29)