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列+主键这两个列的值

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

相关推荐
_Djhhh37 分钟前
权限系统设计方案实践(Spring Security + RBAC 模型)
java·linux·数据库·spring
HaiFan.1 小时前
Redis 常见数据类型
数据库·redis
苹果酱05672 小时前
Golang的数据库备份与恢复
java·vue.js·spring boot·mysql·课程设计
RainbowSea2 小时前
5. MySQL 存储引擎(详解说明)
数据库·后端·mysql
♡喜欢做梦2 小时前
【MySQL】表的增删查改(CRUD)(下)
数据库·mysql
威哥爱编程2 小时前
C语言操作MySQL从入门到精通
c语言·数据库·mysql
24k小善3 小时前
Flink MysqlCDC和OracleCDC对比
java·大数据·mysql·oracle·flink
曼诺尔雷迪亚兹3 小时前
计算机数据库三级刷题总结(博主89分已过,总结的内容分享)
数据库·oracle
XiYang-DING3 小时前
【数据库】数据库基础
数据库
xiaoyustudiowww3 小时前
数据库事务 oracle java
java·数据库·oracle