数据结构
聚簇索引
数据聚合:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。
唯一性:当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中,术语"聚簇"表示数据行和相邻的键值紧凑地存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
叶子节点:主键值,事务ID,用于事务和MVCC的回滚指针以及所有的剩余列。
优点
- 可以把相关数据保存在一起,减少磁盘I/O
- 数据访问更快。因为聚簇索引和数据行保存在同一个B-Tree中,因此它的查询速度要比非聚簇索引快。
- 使用索引覆盖扫描的查询可以直接使用页节点中的主键值
缺点
- 聚簇索引最大限度地提高了I/O密集型应用的性能,如果数据全都放在内存中,则访问顺序就没那么重要了,聚簇索引也就没什么优势了。
- 插入速度严重依赖插入顺序。按照主键插入顺序最快
- 更新聚簇索引列的代价很高,因为会强制InnoDB将每个被更新的行移动到新的位置。
- 基于聚簇索引的表在插入新行,或者主键被更新导致需要移动时,可能会导致页分裂。页分裂会导致表占用更多的磁盘空间。
- 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续
- 二级索引访问需要两次索引查找,而不是一次
- 二级索引可能比想象的要更大,因为在二级索引的叶子节点包含了引用行的主键列。
拓展
InnoDB一定是有聚簇索引的,必须有主键的。就算没有 显示的主键ID,Innodb也会自动将下面俩种作为主键
- 唯一标识数据记录的列作为主键
- 如果不存在唯一的 则会生成一个隐含字段作为主键,字段长度 6个字节,类型为长整型
- 有主键在 主从复制的时候也会更加快速的。
如果大家有用过阿里云的读写分离 你就会发现 在没有主键ID的关联表上,阿里云会额外的帮你添加了一个主键ID进行优化。
非聚簇索引(辅助索引)
定义:在聚簇索引之上创建的索引称为辅助索引,聚簇索引访问索引总是需要二次查找(** 回表操作**)。非聚簇索引的叶子节点存储的不再是行的物理位置 而是主键值。通过非聚簇索引首先我们先找到主键值然后再通过主键值找到数据行的数据页,再通过数据页中的page directory找到数据行。
拓展:MyISAM就是非聚簇索引 它的索引与数据文件是分开的。Innodb的二级索引也是