且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

InnoDB 和 MyISAM 存储引擎的区别

更新时间:2021-10-29 20:31:43

环境

index_demo 建表语句:

mysql> CREATE TABLE index_demo( 
    -> c1 INT, 
    -> c2 INT, 
    -> c3 CHAR(1), 
    -> PRIMARY KEY (c1) 
    -> ) ROW_FORMAT = COMPACT; 
Query OK, 0  rows affected (0.03 sec) 

区别

InnoDB:「数据即索引,索引即数据」
MyISAM:「索引即索引,数据即数据」

InnoDB 索引方案

  • InnoDB 存储引擎会自动为主键建立聚簇索引(如果没有显式指定主键或者没有声明不允许存储NULL 的 UNIQUE 键,它会自动添加主键),聚簇索引的叶子节点包含完整的用户记录。
  • 我们可以为列建立二级索引,二级索引的叶子节点包含的用户记录由索引列和主键组成。如果想通过二级索引查找完整的用户记录,需要执行回表操作,也就是在通过二级索引找到主键值之后,再到聚簇索引中查找完整的用户记录。

MylSAM 索引方案

  • MyISAM 的索引方案也使用树形结构,但是将索引和数据分开存储。MyISAM 将表中的记录按照记录的插入顺序单独存储在一个文件中(称之为数据文件)。这个文件并不划分为若干个数据页,有多少记录就往这个文件中塞多少记录。这样一来,我们可以通过行号快速访问到一条记录。
  • MyISAM 记录也需要记录头信息来存储一些额外数据。给 index_demo 表插入一些数据后,我们来看下它的记录如何在存储空间中展示:

InnoDB 和 MyISAM 存储引擎的区别

  • 使用 MyISAM 存储引擎的表会把索引信息单独存储到另外一个文件中(称为索引文件)。MylSAM 会为表的主键单独创建一个索引,只不过在索引的叶子节点中存储的不是完整的用户记录,而是主键值与行号的组合,也就是先通过索引找到对应的行号,再通过行号去找对应的记录!这意味着使用 MyISAM 存储引擎的索引进行查询时,每次都需要进行回表操作!MyISAM 中建立的索引相当于全部都是二级索引!同理,如果为其他列分别建索引或者建联合索引,在叶子节点处存储的是相应的列 + 行号。