日期:2014-05-16  浏览次数:20556 次

4-6章Mysql技术内幕InnoDB存储引擎——表&索引算法和锁

[-]

innodb存储引擎表类型

innodb逻辑存储结构

表空间tablespace

段segment

区extend

页page

innodb物理存储结构

innodb行记录格式

compact行记录格式

redundant行记录格式

行溢出数据

compressed与dynamic记录格式

char的行结构存储

innodb数据页结构

named file formats

约束

数据完整性

约束的创建和查找

约束和索引的区别

对于错误数据的约束

ENUM和SET约束

触发器与约束

外键

视图

视图的作用

物化视图

分区表

分区表的概述

子分区

分区中的NULL值

分区的性能

索引和算法

innodb存储引擎概述

二分查找法

平衡二叉树

B树

B树的插入操作

B树的删除操作

B树索引

B树索引的管理

B树索引的使用

什么时候使用B树索引

顺序读随机读与预读取

hash索引

哈西表hash table

自适应哈西索引

什么是锁

innodb存储引擎中的锁

锁的类型

一致性的非锁定读操作

SELECTFOR UPDATE SELECTLOCK IN SHARE MODE

自增长和锁

外键和锁

锁的算法

锁问题

阻塞

死锁

?

4.1、innodb存储引擎表类型

innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示的定义主键则innodb如按照如下方式选择或者创建主键。

首先表中是否有唯一非空索引(unique not null),如果有则该列即为主键。

不符合上述条件,innodb存储引擎会自动创建一个6字节大小的指针,rowid()。

4.2、innodb逻辑存储结构

innodb的逻辑存储单元由大到小分别是 tablespace,segment,extent,page(block)组成

4.2.1、表空间(tablespace)

所有数据都是存放在表空间中的,启用了参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间中,每张表空间内存放的只是数据,索引和插入缓冲,其他类的数据,如undo信息,系统事务信息,二次写缓冲等还是存放在原来你的共享表空间。

4.2.2、段(segment)

常见的segment有数据段、索引段、回滚段。innodb是索引聚集表,所以数据就是索引,索引就是数据,那么数据段即是B+树的页节点(leaf node segment),索引段即为B+树的非索引节点(non-leaf node segment)。而且段的管理是由引擎本身完成的。

4.2.3、区(extend)

  ? ?区是由64个连续的页主成,每个页大小为16K,即每个区的大小为(64*16K)=1MB,对于大的数据段,mysql每次最多可以申请4个区,以此保证数据的顺序性能。

4.2.4、页(page)

页是innodb磁盘管理最小的单位,innodb每个页的大小是16K,且不可更改。常见的类型有:数据页 B-tree Node;undo页 Undo Log Page;系统页 System Page;事务数据页 Transaction system Page;插入缓冲位图页 Insert Buffer Bitmap;插入缓冲空闲列表页 Insert Buffer freeBitmap;未压缩的二进制大对象页Uncompressed BLOB Page;压缩的二进制大对象页 Compressed BLOB Page。

4.2.5、行

innodb存储引擎是面向行的(row-oriented),也就是说数据的存放按行进行存放。每个页最多可以存放16K/2~200行,也就是7992个行。

?

?

4.3、innodb物理存储结构

innodb引擎由共享表空间,日志文件(redo log),表结构定义文件组成。

4.4、innodb行记录格式

mysql从5.1开始,innodb提供了compact和redundant(为了兼容以前版本)两种格式来存放行记录数据。

4.4.1、compact行记录格式

Compact行记录的设计目标是能高效存放数据。不管是char还是varchar类型,NULL指是不占用存储空间的。行记录中还包括两个隐藏列 事务ID列(6字节)和回滚指针列(7字节) 若没有定义的PrimaryKey 会增加一个6字节的RowID列。InnoDB在页内部是通过一种链表方式串联各个行记录的。

4.4.2、redundant行记录格式

Redundant行记录格式为了兼容以前版本。每个行最多有1023个列,因为列的数量占用了10位。对于varchar的NULL值,它不占用任何存储空间,而对于类型char的NULL值需要占用空间。

4.4.3、行溢出数据

innoDB存储引擎可以将一条记录中的某些数据存储在真正的数据页面之外,作为行溢出数据。Varchar(N)中的N指的是字符的长度,官方手册中定义的65535长度是指所有VARCHAR列的长度总合。

?

数据一般都是存放在B-tree Node的页类型中,但是发生行溢出的时,存放行溢出的页类型为Uncompress BLOB Page。如果一个页中至少放入两行的数据,那varchar就不会存放到BLOB页中,阀值长度为8098。对于TEXT或者BLOB的数据类型,我们总是以为它们是放在Uncompressed BLOB Page中的,其实这也是不准确的,放在数据页还是BLOB页同样和前面讨论的VARCHAR一样。

?

4.4.4、compressed与dynamic记录格式

InnoDB Plugin引入了新的文件格式成为Barracuda文件格式,它拥有两种新的行记录格式Compressed和Dynamic两种,它对于存放BLOB的数据采用了安全的行溢出方式。

4.4.5、char的行结构存储

从mysql4.1开始CHR(n),中N指定的是字符的长度,而不是之前版本的字节长度。也就是说在不同字符集下,CHAR的内部存储不是定长的数据。可以通过select a,char_length(a),length(a) from t;查看字符和字节数。所以在多字符集下,char和varchar占用a空间是一样的。

4.5、innodb数据页结构

InnoDB数据页由七部分组成:

File Header:文件头( 38 bytes )

Page Header:页头( 56 bytes )

Infimum + Supremum Records:页中上/下界记录

Users Records:用户记录,即行记录

Free Space:空闲空间

Page Directory:叶目录

File Trailer:文件结尾信息

4.6、named file formats

innodb存储引擎通过named file formats机制来解决不同版本下页结构兼容性问题。之前的版本定义为Antelope(包括Compact和Redudant文件格式),最新定义为Barracuda(包括Compressed和Dynamic文件格式)。使用参数innodb_file_format指定文件格式。

4.7、约束

4.7.1、数据完整性

innodb提供了以下四种约束:Primary key,Unique Key,Foreign Ke