赵玉伟的博客

innodb, myisam索引

聚簇索引&非聚簇索引

我的理解如下:在一张表上存在索引, 那么数据可以分为 索引数据表数据;

  • 如果索引数据和表数据是放在同一棵树中,那么这种索引结构可以称之为聚簇索引;
  • 如果索引数据和表数据不是在一棵树中,那么这种结构可以称之为非聚簇索引。

聚簇索引的逻辑结构:

说明: 叶子节点为表数据, 非叶子节点为索引数据, 他们存在于同一棵树中。

非聚簇索引的逻辑结构:

说明: 叶子节点为 索引值 + 主键值, 非叶子节点为索引数据; 表数据单独存储, 不和索引数据在同一棵树中。


innodb索引

索引分类

在mysql中, 索引结构是和引擎相关的, 也就是不同的引擎有不同的索引结构,innodb的索引一般包括如下两种:

  • [x] 主键索引(primary key):这种索引和数据聚簇在一起,所以可以归为聚簇索引
  • [x] 二级索引(secondary index),也叫辅助索引: 这种索引的叶子节点仅仅存储 索引 以及 索引对应的主键值

如何建索引

在表中增加一列ID作为主键索引, 值为从1开始递增的实数; 优点:占用空间小, 叶子节点的数据从左到右按顺序递增, 数据在磁盘上保持连续, 插入数据时, 硬盘的磁头可以按顺序插入,效率高。

innodb引擎,一定会存在一个主键索引, 即使不显示指定,innodb也会隐式设置一列作为主键索引。
innodb引擎只有一个聚簇索引,即主键索引; 可以有多个非聚簇索引,即二级索引。

注意点

1.切忌主键索引的值不要太大,会占用较大空间
2.切忌用随机数,比如UUID作为主键,插入数据时因为主键不连续,插入时磁头会移动寻址,而且会移动叶子节点的数据


myisam索引

myisam的主键索引和二级索引相同, 叶子节点上仅仅存储index + key; 因为该中引擎使用的场景比innodb少很多,不再赘述。

下图为innodb和myisam索引的逻辑结构图(左侧为innodb,右侧为myisam):