聚簇索引和非聚簇索引

2020-12-30  本文已影响0人  cold_style

聚簇索引:索引的叶节点就是数据节点。innodb

非聚簇索引:非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。MyISAM

两个都B+树 叶子节点是 链表

聚簇索引需要注意的地方

当使用主键为聚簇索引时,主键最好不要使用uuid,因为uuid的值太过离散,不适合排序且可能出线新增加记录的uuid,会插入在索引树中间的位置,导致索引树调整复杂度变大,消耗更多的时间和资源。

建议使用int类型的自增,方便排序并且默认会在索引树的末尾增加主键值,对索引树的结构影响最小。而且,主键值占用的存储空间越大,辅助索引中保存的主键值也会跟着变大,占用存储空间,也会影响到IO操作读取到的数据量。

为什么主键通常建议使用自增id

聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。如果主键不是自增id,那么可以想 象,它会干些什么,不断地调整数据的物理地址、分页,当然也有其他一些措施来减少这些操作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。

唯一索引和普通索引的区别:
普通索引在更新的时候会先去缓存中找数据没找到的话会先记录这次操作,等下一次取数据的时候进行数据merge减少了io次数
而唯一索引由于需要多对比一次冲突 这时候用change buffer 没什么意义 反而增大了维护changebuffer的开销。

所以一般修改删除比较多的时候都是用普通索引,如果更新完马上就要用的需求比较多的话就要考虑用唯一索引了。

覆盖索引:

覆盖索引:一个索引中包含所有需要查询字段的值

优点:无需回表

1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。
2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用
4.innodb的聚簇索引,覆盖索引对innodb表特别有用

上一篇下一篇

猜你喜欢

热点阅读