Mysql聚簇索引与非聚簇索引B+树实现区别详解

聚簇索引

特点:

  • 索引和数据保存在同一个B+树中,
  • 每一页 也就是每一个节点是按照主键的大小顺序排成一个单项链表,
  • B+树的每一层的页与页之间也是根据主键大小顺序排成一个双向链表,
  • 非叶子节点存储的是记录的主键+指向的页号,
  • 叶子节点存储的是完整的用户记录。

优点:

  • 数据的访问快,因为数据就在这个B+树中,比非聚集索引少了回表的操作
  • 聚簇索引对主键的排序查找和范围查找速度很快。因为B+树是按照主键的大小建立的,而且叶子节点是双向链表找左右的数据非常快。
  • 比非聚集索引节省了大量的IO操作

缺点:

  • 插入速度严重依赖于插入的顺序,按照主键的顺序插入是最快的方式,否则将出现页分裂,严重影响性能。因此对于InnoDB,我们一般都会定义一个自增的ID列作为主键
  • 更新的代价高......

限制:

  • 只有InnoDB引擎支持聚簇索引,MyISAM不支持聚簇索引
  • 由于物理排序方式只能有一种,所以每个MySQL的表只能由一个聚簇索引
  • 如果没有为表定义主键,InnoDB会选择非空的唯一索引列代替。如果没有这样的列,InnoDB会自己定义一个 隐式主键 作为聚簇索引
  • 为了充分利用聚簇索引的特性,InnoDB中表应该选择有序的id,不建议使用无序的id,比如UUID、字符串作为索引,这样就无法保证数据的顺序增长。

非聚簇索引:(二级索引、辅助索引)

聚簇索引,只能在所搜条件是主键值是才能发挥作用,因为B+树中的数据都是按照主键进行排序的,如果我们想以别的列作为搜索条件,那么就需要创建非聚簇索引。

例如,以c2列作为搜索条件,那么需要使用c2列创建一棵B+树,如下所示:

这个B+树与聚簇索引的不同点:

  • 页内的记录是按照从c2列的大小顺序排成的一个单项链表。
  • 页和页直接按也是根据页中记录的c2列的大小顺序排成的一个双向链表
  • 非叶子节点存储的是记录的c2列+指向下一层页号
  • 叶子节点存储的并不是完整的用户记录,而只是c2列+主键这两个列的值

一个表中可以有多个非聚簇索引,但是聚簇索引只能有一个。

相关推荐
笔头子7 分钟前
【Caché】数据库基础操作
数据库
上火的金鱼妹9 分钟前
redis集群部署与连接
数据库·redis·缓存
程序员-Benothing23 分钟前
MySQL 二级索引有 MVCC 快照吗?
数据库·mysql
xiaoxiangsiyan39 分钟前
网络智能化转型核心模块全解析
运维·服务器·网络·数据库·学习·架构·php
不才不才不不才41 分钟前
Spring 源码系列(25): @EnableTransactionManagement 与 TransactionInterceptor
java·数据库·spring
l1t1 小时前
DeepSeek总结的DuckDB访谈:DuckDB的崛起、扩展与AWS收购
数据库·云计算·aws·duckdb
隔窗听雨眠1 小时前
CI/CD测试数据清理完全指南:从污染根因到三层清理覆盖的完整方案
java·数据库·ci/cd
无定义_1 小时前
Bellman-Ford——贝尔曼福特算法
数据库·算法
盟接之桥1 小时前
半导体供应链破局:EDI如何成为中国制造的数字通行证
大数据·运维·服务器·网络·数据库·人工智能·制造
其实防守也摸鱼1 小时前
ZLibrary 类项目合规避坑指南:从技术实现到法律风险的全景梳理
运维·服务器·数据库·安全·自动化·github·copilot