首页 > 编程知识 正文

什么是聚簇索引和非聚簇索引?,聚簇索引和普通索引

时间:2023-05-05 15:38:02 阅读:201550 作者:332

释义:
聚簇索引:将数据与索引放到了一起存储,索引树结构的叶子节点保存了行数据

非聚簇索引:将数据与索引分开存储,索引结构的叶子节点放的是指向数据的指针(或者说是地址)

在mysql中的应用 innodb的索引都是聚簇索引,其数据直接存放在叶子节点上,但是主键索引(一级索引)叶子节点中存放的就是数据本身,辅助索引的叶子节点上存储的是主键。myisam使用的是非聚簇索引,其叶子节点上不存放数据,存放的是数据的实际地址。一张表一定只有一个聚簇索引,因为聚簇索引代表了文件的实际存储形式,一张表在磁盘上只会有一种存储结构。如果没有主键的话,InnoDB 会选择一个现有的唯一且非空的索引代替,如果没有这样的索引,InnoDB 会隐式定义一个主键 查询的区别

我们在上一篇文章中已经谈过一些

如果使用的是二级索引(辅助索引)来检索数据,在没有索引覆盖的情况下进行查找,最终拿到的都是主键。拿到主键以后再进行回表查找。如果使用的是主键索引,最终检索到的就是数据行,叶子节点上的数据之间还形成一种链表结构,方便于顺序范围性的查找数据。 对比 聚簇索引相比于非聚簇索引的优势和劣势 缓存知识介绍

我们知道一次io读写,可以获取到4k(或者16K,需要看操作系统中的配置)大小的资源,我们称之为读取到的数据区域为Page(页)。当需要查询某个索引的bB+树结构的时候,某些页被加载到内存的缓存区域中,查询操作会在内存里操作,而不用再次进行IO操作了。当要查询的行数据不在缓存里,才会触发新的IO操作。

聚簇索引优势

通过上面的缓存知识来看,如果数据存放的位置是相对连续的,则缓存命中率会很高。而聚簇索引正好就是在磁盘上连续存放的。因为MyISAM的主索引并非聚簇索引,那么他的数据的物理地址(硬盘数据区的编号)相对于聚簇索引是比较凌乱的,拿到这些物理地址,按照合适的算法进行I/O读取,于是开始不停的寻道不停的旋转,且存储地址跨度过大,也容易导致缓存命中率低。

另外,如果数据发生改变,其存储地址很可能也会发生改变。这时候myisam由于索引存放的是存储地址,所以需要更新索引结构。聚簇索引除了主键索引以外的索引,存储的都是主键,主键不发生改变二级索引基本不需要维护,只需要维护主键索引就好了。

聚簇索引劣势

但是聚簇索引并不是没有缺点,最显著的缺点就是二级索引查询的时候,都需要查询两次,第一次查询二级索引树,拿到主键,第二次再回表拿到真实的行数据。另外如果说主键选择不当的时候,会容易经常的触发聚簇索引的树结构旋转,重排甚至是页分裂等,所以我们是建议使用自增列来做主键的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。