InnoDB的主键索引

  1. InnoDB的主键索引使用聚簇索引,关于聚簇索引的通用特点可以看这篇博客,这里说InnoDB的主键索引的特点。
  2. InnoDB的主键索引,叶子节点存储主键值和数据行 ,合称数据页,通常一个数据页大小有16KB (可以调);非叶子节点存储索引的键值和数据页的页号。
  3. 叶子节点之间是双向链表,方便范围查询;数据页内部采用的行目录(Row Directory)来管理数据行的位置,行目录记录了每一行的偏移量。

从索引结构对比InnoDB和MyISAM

对于主键,InnoDB使用聚簇索引,MyISAM使用非聚簇索引。

  1. 查询效率

    • InnoDB的查询效率会比MyISAM高,主要因为聚簇索引使数据的物理存储有序,并且索引和数据存储在一起,减少回表

    • MyISAM的查询操作有额外的I/O开销,因为非聚簇索引在查询时需要先查找索引,获取数据位置,然后根据指针定位到数据本身,有回表操作,增加了磁盘I/O操作

  2. 复杂查询场景:相比MyISAM,InnoDB对复杂查询场景的处理表现会更好,也是因为数据存储顺序和磁盘I/O开销的问题

  3. 索引维护问题:

    • 索引更新时,如果表中有多个非聚簇索引,一次更新要维护多个非聚簇索引的更新;如果表中有一个聚簇索引和一个非聚簇索引,在聚簇索引之外也需要额外维护一个非聚簇索引的更新
    • MyISAM的索引文件 (.MYI) 和数据文件 (.MYD)是分开的,在更新索引的过程中,如果系统崩溃,索引可能和数据不一致
    • 也因为MyISAM不支持事务,所以正常索引更新时,如果涉及多表操作,数据的一致性和完整性无法保证