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

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

相关推荐
j7~2 小时前
【仿 RabbitMQ 项目】发布订阅消息队列 (篇九):队列数据管理,内存镜像 + SQLite 持久化实现
数据库·c++·分布式·sqlite·rabbitmq·队列数据管理
l1t2 小时前
DeepSeek总结的PostgreSQL中TABLESAMPLE 如何挑选行
数据库·sql
qyyyyy5702 小时前
WhatsApp 联系人表格怎么清洗?Excel 文本类型、重复号码与姓名冲突处理
数据库·自然语言处理·excel·hash
云贝贝贝2 小时前
Oracle 认证实战指南
数据库·oracle
靠沿2 小时前
MySQL数据库基础——事务
java·数据库·mysql
AIFQuant2 小时前
Python港股实时行情API接入:恒生股票数据获取与AH股溢价监控实战
开发语言·数据库·python·金融·实时数据api
夜雪一千2 小时前
MySQL 中查询和操作JSON类型的数据
数据库·mysql·json
达梦数据2 小时前
达梦数据复制软件DMDRS搭建部署示例:源数据库DMDPC到目标数据库DM8一对一数据同步
数据库·oracle
AIgorithmGEEK11 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
Lost_the_wind11 小时前
MySQL学习笔记四
mysql