环境
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 表插入一些数据后,我们来看下它的记录如何在存储空间中展示:
- 使用 MyISAM 存储引擎的表会把索引信息单独存储到另外一个文件中(称为索引文件)。MylSAM 会为表的主键单独创建一个索引,只不过在索引的叶子节点中存储的不是完整的用户记录,而是主键值与行号的组合,也就是先通过索引找到对应的行号,再通过行号去找对应的记录!这意味着使用 MyISAM 存储引擎的索引进行查询时,每次都需要进行回表操作!MyISAM 中建立的索引相当于全部都是二级索引!同理,如果为其他列分别建索引或者建联合索引,在叶子节点处存储的是相应的列 + 行号。