MySQL的聚簇索引

记录一个有意思的,平时没有显示使用过的索引

什么是聚簇索引

聚簇索引不是一种单独的索引类型,而是一种数据存储方式,以InnoDB为例,聚簇索引的数据结构为在同一个结构中保存Btree索引和数据行

聚簇索引的数据结构

1
2
3
graph LR
索引+数据行1-->索引+数据行2
索引+数据行2-->索引+数据行3

数据行的存放时位于索引的叶子页中,聚簇这个词的含义即表示数据行和相邻的键值紧靠着存储,因为数据行不能存在于两个位置,所以每个表至多只能有一个聚簇索引

优点

  • 聚簇索引可以把相关的数据保存在一起,提高IO密集型的操作效率,避免全表扫描导致的IO
  • 查询速度更快,在索引命中后可以通过搜索叶子页快速定位数据行
  • 使用覆盖索引扫描的查询可以直接使用页节点中的主键值

    缺点

  • 聚簇索引提高了IO密集型应用的性能,不能保证其他场景的效率
  • 插入速度依赖插入顺序,根据ID的顺序进行插入效率最高
  • 更新聚簇索引的消耗很高,InnoDB会对需要根系的数据行进行重新分配位置
  • 针对主键的新增和修改,都会使一个子页中添加新的数据行,如果页已经存满,会导致页分裂,页分裂会产生磁盘的缝隙
  • 在全表扫描时性能不佳,在数据行分散,以及页分裂导致的存储不连续更为明显
  • 二级索引(非聚簇索引),会在叶子节点包含数据行的主键列,会更庞大
  • 二级索引的访问需要进行两次索引查找,二级索引存储数据行的主键值,再通过聚簇索引进行查找

    聚簇索引和非聚簇索引区别

  • 非聚簇索引的数据和索引存储无关
  • 非聚簇索引可以有多个