1 文件
InnoDb存储引擎文件:
表空间文件
重做日志文件
2 表
表按照主键顺序组织存放,也成为索引组织表.
未指定主键时的选择:选取该表第一个定义的非空唯一索引作为主键,否则自动创建一个6字节大小的指针.
2.1 视图
2.2 分区表
3 索引
3.1 B+树索引
3.1.1 聚集索引 Clustered Index
按照主键构造B+树,叶子节点存放的即为整张表的行记录数据(也称为数据页).
聚集索引的存储并不是物理上连续的,而是逻辑上连续的.(数据页通过双向链表链接,按主键顺序排序;每个页中的记录也是通过双向链表维护,物理存储上同样可以不按主键存储).
3.1.2 辅助索引 Secondary Index
3.1.3 索引管理
3.1.3.1 Fast Index Creation
创建辅助索引时,对表加上S锁,注意此时只能对表进行读操作,若有大量的事务需要对目标表进行写操作,数据库服务将不可用.
删除索引只需要更新内部视图.
只适用于辅助索引,对主键的创建和删除仍然需要重建表.
3.1.3.2 Online Schema Change
含义是在事务的创建过程中,可以有读写事务对表进行操作,提高了原有的MySQL数据库在DDL操作时的并发性.
3.1.3.3 Online DDL
允许在创建辅助索引的同时,还允许诸如INSERT,UPDATE,DELETE这类DML操作.
包括辅助索引的创建和删除,改变自增长值,添加和删除外键约束,列的重命名都可以是在线的.
新的ALTER TABLE语法
ALGORITHM中DEFAULT表示依据参数old_alter_table来判断是否是使用INPLACE,COPY算法;COPY表示按照5.1版本之前的模式,即创建临时表;INPLACE表示索引创建和删除时不需要创建临时表.
LOCK为索引创建或删除时对目标表添加锁的情况:
NONE 不添加任何锁
SHARE 与FIC类似,对目标表加S锁.对于并发的读事务,依然可以执行;但是遇到写事务,就会发生等待操作.
EXCLUSIVE 对目标表加X锁.读写事务都不能进行,因此会阻塞所有的线程.
DEFAULT
3.1.4 B+树索引的使用
3.1.4.1 联合索引
3.1.4.2 覆盖索引 Covering Index
从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录.
好处:
1.辅助索引不包含整行记录的所有信息,故其大小远小于聚集索引,因此可以减少大量的IO操作;
2.对于某些统计问题,并不需要查询聚集索引.
3.1.4.3 FORCE INDEX & USE INDEX
3.1.4.4 MRR优化 & ICP优化
MRR场景: range, ref, eq_ref
ICP场景: range, ref, eq_ref, ref_or_null
3.2 哈希索引
哈希索引只能用来搜索等值的查询.
3.3 全文索引
3.3.1 原理
采用full inverted index的方式,{单词,(单词所在文档的ID,在具体文档中的位置)}.
将word存放到一张表中,称为Auxiliary Table.
FTS Index Cache
3.3.2 使用
NATURAL LANGUAGE
IN BOOLEAN
Query Expansion
4 锁
4.1 InnoDB中的锁
InnoDB支持两种行级锁: 共享锁S,排他锁X
也支持两种表级的意向锁:意向共享锁IS,意向排它锁IX
4.1.1 一致性非锁定读
读取的行正在执行UPDATE或DELETE操作,会去读取行的一个快照数据.
快照数据是指该行的之前版本的数据,通过undo段实现.undo用来在事务中回滚数据,因此快照数据本身没有额外的开销.
READ COMMITTED: 读取被锁定行的最新一份快照数据
REPEATABLE READ: 读取事务开始时的行数据版本
4.1.2 一致性锁定读
SELECT ... FOR UPDATE 对读取的行记录加一个X锁
SELECT ... LOCK IN SHARE MODE 对读取的行记录加一个S锁
4.1.3 自增长与锁
MySQL5.1.22版本前: AUTO_INC Locking采用一种特殊的表锁机制,锁不是在一个事务完成后才释放,而是在完成对自增长值插入的SQL语句后立即释放.
设置nnodb_autoinc_lock_mode控制自增长的模式.
4.1.4 外键与锁
4.2 锁的3种算法
Record Lock
Gap Lock: 阻止多个事务将记录插入到同一个范围中,而这会导致Phantom Problem的产生.
Next-Key Lock: 解决Phantom Problem.
REPEATABLE READ下,采用Next-Key Lock的方式加锁.
READ COMMITTED下,采用Record Lock的方式加锁.
4.3 锁问题
脏读,幻读,丢失更新
4.4 死锁的解决
等待图wait-for graph进行死锁检测,通常采用深度优先算法实现.
5 事务
5.1 事务的分类
扁平事务: 不能提交和回滚事务的某一部分
带保存点的扁平事务:
链事务:
嵌套事务: MySQL或InnoDB都不支持
分布式事务:隔离级别必须设置为SERIALIABLE。
5.2 事务的实现
5.2.1 redo log
事物日志通过redo日志和日志缓冲(InnoDB Log Buffer)实现。
恢复提交事务修改的页操作,通常是物理操作,记录的是页的物理操作,保证事务的原子性和持久性.
参数innodb_flush_log_at_trx_commit用来控制重做日志刷新到磁盘的策略.
5.2.2 undo log
回滚行记录到某一个特定版本,是逻辑日志,根据每行记录进行记录,保证事务的一致性.
undo存放在数据库内部的一个特殊段(segment),被称为undo段.undo段位于共享表空间内.
undo除了回滚外,还可以MVCC.(即该记录已经被其他事物占用,当前事务可以通过undo读取之前的行版本信息,以实现锁定行读取.)
purge用于最终完成delete和update操作.实现方式是history list.
5.2.3 二进制日志 binlog
一种逻辑日志,其记录的是对于的SQL语句.只在事务提交完成后进行一次写入.
5.2.4 group commit
一次fsync可以刷新确保多个事务日志文件被写入文件.
MySQL5.6 采用了Binary Log Group Commit(BLGC),实现方式为
6 备份
6.1 逻辑备份
mysqldump: 可以导出存储过程,触发器,事件,数据,但是不能导出视图.
SELECT * INTO OUTFILE
LOAD DATA INFILE
mysqlimport
6.2 二进制日志的备份与恢复
命令mysqlbinlog可以完成二进制日志的恢复.
6.3 热备份
InnoDB官方提供的热备工具是ibbackup;
XtraBackup是Percona公司开发的开源热备工具,其实现了增量备份.
6.4 快照备份
MySQL数据库本身并不支持快照功能,因此快照备份是指通过文件系统支持的快照功能对数据库进行备份.
支持快照功能的文件系统和设备包括了FreeBSD的UFS文件系统,Solaris的ZFS文件系统,GNU/Linux的逻辑管理器.