聚簇索引
聚簇索引一定要单拿出来进行分析,因为太重要啦!我们平时使用最多inndb就是聚簇索引。
划重点!!:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,起细节依赖于其实现方式。InnDB的聚簇索引实际上是在同一个结构中保存了B-Tree索引和数据行
当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中。术语”聚簇”标识数据行和相邻的键值紧凑的存储在一起。因为无法同事吧数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
这篇主要赶住InnDB,但是这里讨论的所有原理 对于支持聚簇索引的存储引擎都是使用的。
InnoDB通过主键聚集数据,索引被索引的列就是主键列。如果没有定义主键,InnoDb会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚簇索引,InnoDB 只聚集在同一个页面中的记录,包换相邻键值的页面可能会相距甚远。
想了解inndb的存储结构可以参考下面的博客:
聚簇索引的优缺点
任何事物都是有两面性,算法和数据结构就是在空间和时间,效率和复杂性等方面的平衡,聚簇索引也一样
优点
- 把相关数据放在一起方便一次性查询
- 访问数据更快,聚簇索引把索引和数据保存在同一个B-Tree中
- 还用覆盖索引扫描的查询可以直接使用页节点中的主键值
缺点
- IO密集型对访问顺序的优化可以减少页的加载,如果数据全部在内存中访问顺序没有那么重要,聚簇索引依旧没什么优势啦。
- 插入数度严重历来插入顺序
- 更新聚簇索引的代价很高,会强制Innodb就昂每个呗更新的行移动到新的位置
- 插入新行或主键被更新,可能照成页分裂
- 如果行稀疏或页分裂可能或照成全表扫描变慢
- 二级索引会更大因为要保存主键列,同时会进行二次查找