MySQL存储引擎
InnoDB存储引擎
特点:
- 支持事务
- 行级锁
- B树组织索引
- 支持外键
InnoBD 多版本(multi-versioned)
InnoDB默认为每一行记录添加了三个字段:
- DB_TRX_ID (6byte): 该记录最近一次发生inserted或updated操作的事务标识
- DB_ROLL_PTR (7byte): 回滚指针,指向rollback segment中的undo log记录,undo log记录中包含updated操作之前的行数据
- DB_ROW_ID (6byte): 新插入行的单调递增ID,当由InnoDB自动生成聚簇索引时,该索引包含Row ID的值,否则DB_ROW_ID列不会出现在任何索引中
聚簇索引(Clustered Index)
每个InnoDB表都有一个用来存储所有行数据的特殊索引:Clustered Index
。所有行数据都是通过聚簇索引来组织存储的。 通常情况下,聚簇索引是主键的代名词。
如果没有为InnoDB表定义一个主键,Mysql会选择表中第一个非空的唯一索引列
做为聚簇索引。若该表没有主键或合适的唯一索引列,InnoDB内部会在包含row ID的虚拟列上生成一个隐藏的聚簇索引。Row ID的值是根据新插入记录的顺序而单调递增的。
官方文档:
If the table has no PRIMARY KEY or suitable UNIQUE index, InnoDB internally generates a hidden clustered index on a synthetic column containing row ID values. Thus, the rows ordered by the row ID are physically in insertion order.
辅助索引(Secondary Index)
除了聚簇索引之外的所有索引称为辅助索引。
在InnoDB中,辅助索引的每一条记录存储该行的所有主键字段,这些主键字段。InnoDB使用主键的值在聚簇索引中查找对应的记录。
InnoDB索引的物理结构
- 所有的InnoDB索引都是以B树的形式存储的,索引记录存储在树的叶子节点。
- 聚簇索引存储记录的所有字段,包含6个字节的
transaction ID
字段和7个字节的roll pointer
字段。 - 若没有为表设置主键,每个聚簇索引记录还会包含一个6字节的
row ID
字段。 - 每个辅助索引记录包含主键的值
覆盖索引(covering index)
覆盖索引:从辅助索引中就可以得到查询的记录,而不需要查询聚簇索引中的记录。
使用覆盖索引的好处: 辅助索引不包含整行记录的所有字段信息,故其大小远小于聚簇索引,因此可以减少大量的IO操作。
MyISAM存储引擎
特点:
- 不支持事务
- 表级锁
- 不支持外键
- MyISAM表存储有三个文件组成:
- table_name.frm 存储表结构
- table_name.MYD 数据文件
- table_name.MYI 索引文件