版次: 2013年5月第1版

印次: 2020年11月第34次印刷

 

 

1.1 逻辑架构

  1. MySQL大体分3层架构, 最上层连接客户端, 主要做连接/线程处理;第二层是大多数MySQL的核心功能, 包括查询解析/分析/优化/缓存以及所有的内置函数第三层主要是存储引擎
  2. MySQL在查询时会使用缓存优化, Page3

1.2 并发控制

  1. 解决并发问题的经典方法是采用并发控制, 这里用到了读写锁, 也分别称为shared lock(read), 和exclusive lock(write), 读锁可以共享, 而写锁不能(是排他的)
  2. 锁粒度的问题, 指让锁定对象更有选择性, 锁定部分区域. 所谓的锁策略,就是在锁的开销和数据的安全性质检寻求平衡; 表锁(table lock)是MySQL中最基本的锁策略, 还有行级锁(row lock)可以最大程度地支持并发处理(同时带来了最大的锁开销)

1.3 事务(transaction)

  1. ACID特性, atomicity, consistency, isolation, durability
  2. 四个隔离级别, READ UNCOMMITTED(会出现dirty read), READ COMMITED(默认级别, 另称nonrepeatable read), REPEATABLE READ(会产生phantom read), SERIALIZABLE(可串行化, 最高隔离级别)
  3. 解决幻读(phantom read), 在InnoDB和XtraDB中采用多版本并发控制(MVCC, Multiversion Concurrency Control) 解决, 也可以采用SERIALIZABLE解决
  4. 多个事务试图以不同顺序锁定资源时, 就可能产生死锁. 为解决死锁, DBMS实现了各种死锁检测和死锁超时机制, 具体见Page9
  5. 事务日志可以提高效率, 需要写两次磁盘(第一次写在日志上, 第二次是真正将数据记录到数据库文件里)

1.4 多版本并发控制

  1. 可以认为MVCC是行级锁的一个变种, 在很多情况下避免了加锁操作, 虽然实现机制有所不同, 但大多实现了非阻塞的读操作, 写操作也只锁定必要的行
  2. MVCC的实现是通过保存数据在某个时间点的快照, 比如InnoDB的MVCC, 是通过在每行记录后面保存两个隐藏的列, 一个保存行的创建时间, 一个保存行的过期时间(或删除时间), 具体见Page13

1.5 MySQL的存储引擎

  1. 创建表时, MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义, 可以通过
show table status like 'user' \g

来显示表的相关信息, 每个字段对应的解释见page14

  1. InnoDB是MySQL的默认事务型引擎, 设计用来处理大量的短期事务, 实现了4个标准的隔离级别, 其默认级别是REPEATABLE READ, 并且通过间隙锁(next-key locking) 策略防止幻读的出现. 间隙锁使得InnoDB不仅仅锁定查询涉及的行, 还会对索引中的间隙进行锁定, 以防止幻影行的插入;
  2. MyISAM在MySQL5.1及以前是默认的存储引擎, 不支持事务和行级锁, 缺陷是崩溃后无法安全恢复. 对于只读数据, 或者表比较小, 可以忍受修复(repair)操作, 依然可以使用MyISAM引擎; 
  3. MyISAM会将表存储在两个文件中,  数据文件(.MYD), 索引文件(.MYI). 特性是对整张表加锁, 可以支持索引, 设定延迟更新索引键(Delayed Key Write), 可以对表压缩(减少空间占用和磁盘IO)
  4. MySQL有一些内建的其他存储引擎, 详细见page19, 其中个人感觉用到比较多的有CSV引擎和Memory引擎
  5. 选择合适的引擎很重要, 大多数情况下用InnoDB是没有问题的, 如果选择可以参照Page24

1.6 MySQL Timeline (page29)