原创

聚集索引 和 非聚集索引的区别

温馨提示:
本文最后更新于 2022年11月30日,已超过 890 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

聚集索引:

索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的)

非聚集索引

索引的逻辑顺序与磁盘上的物理存储顺序不同。

总结如下:

  1. 如果一个主键被定义了,那么这个主键就是作为聚集索引
  2. 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
  3. 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

聚集索引的缺点:

  1. 聚簇数据最大限度地提高了IO密集型应用的性能,但如果数据全部放在内存中,则访问的顺序就没有那么重要了,聚集索引也没有什么优势了
  2. 插入速度严重依赖于插入顺序,按照主键的顺序插入是加载数据到innodb表中速度最快的方式,但如果不是按照主键顺序加载数据,那么在加载完成后最好使用optimize table命令重新组织一下表
  3. 更新聚集索引列的代价很高,因为会强制innodb将每个被更新的行移动到新的位置

举例说明:
InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第一个not NULL unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
画外音:所以PK查询非常快,直接定位行记录。
InnoDB普通索引的叶子节点存储主键值。
画外音:注意,不是存储行记录头指针,MyISAM的索引叶子节点存储记录指针。

聚集索引搜索一次索引树,普通索引要回表(需要扫描两边索引树)

正文到此结束