InnoDB存储引擎概述--文件,表,索引,锁,事务的原理与实现

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的逻辑管理器.

6.5 复制

posted @ 2018-04-09 19:35  清水捞蟹  阅读(174)  评论(0编辑  收藏  举报