MySQL InnoDB存储引擎简析

MySQL存储引擎

InnoDB存储引擎

特色:sql

  • 支持事务
  • 行级锁
  • B树组织索引
  • 支持外键

InnoBD 多版本(multi-versioned)

InnoDB默认为每一行记录添加了三个字段:ui

  • 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的值是根据新插入记录的顺序而单调递增的。code

官方文档:索引

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使用主键的值在聚簇索引中查找对应的记录。it

InnoDB索引的物理结构

  • 全部的InnoDB索引都是以B树的形式存储的,索引记录存储在树的叶子节点。
  • 聚簇索引存储记录的全部字段,包含6个字节的transaction ID 字段和7个字节的roll pointer字段。
  • 若没有为表设置主键,每一个聚簇索引记录还会包含一个6字节的row ID字段。
  • 每一个辅助索引记录包含主键的值

覆盖索引(covering index)

覆盖索引:从辅助索引中就能够获得查询的记录,而不须要查询聚簇索引中的记录。io

使用覆盖索引的好处: 辅助索引不包含整行记录的全部字段信息,故其大小远小于聚簇索引,所以能够减小大量的IO操做。table

MyISAM存储引擎

特色:

  • 不支持事务
  • 表级锁
  • 不支持外键
  • MyISAM表存储有三个文件组成:
    • table_name.frm 存储表结构
    • table_name.MYD 数据文件
    • table_name.MYI 索引文件
相关文章
相关标签/搜索