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

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

相关推荐
今晚务必早点睡1 小时前
微服务改数据库密码后服务仍能访问?一次“看似异常、实则常见”的生产现象全解析
数据库·微服务·oracle
老师我太想进步了20263 小时前
cmd连接MySQL及相关查询
数据库·mysql
難釋懷6 小时前
Redis命令-Set命令
数据库·redis·缓存
Linux-palpitate6 小时前
PostgreSQL(PG)的1主2从集群部署安装
数据库·postgresql
heartbeat..7 小时前
数据库基础知识体系:概念、约束、范式与国产产品
java·数据库·学习笔记·国产数据库
山峰哥7 小时前
数据库工程核心:SQL调优让查询效率飙升的实战密码
网络·汇编·数据库·sql·编辑器
Coder_Boy_8 小时前
基于SpringAI的在线考试系统-DDD业务领域模块设计思路
java·数据库·人工智能·spring boot·ddd
小雪_Snow8 小时前
Windows 安装 MySQL 8.0 教程【安装包方式】
数据库·mysql
无敌的牛8 小时前
MySQL初阶
数据库·mysql
不会C++的雾9 小时前
Linux操作系统(2)
linux·数据库·mysql