MySQL的聚簇索引和非聚簇索引的区别以及示例

MySQL的聚簇索引和非聚簇索引

聚簇索引

聚簇索引是一种索引结构,它与数据行存储在一起,即索引的叶子节点就是数据行本身。在MySQL中,主键索引就是一种典型的聚簇索引。

涉及情况

当查询需要按照主键或唯一索引进行精确查找时,会涉及到聚簇索引。

数据结构

聚簇索引的数据结构是B+树,它的叶子节点存储了完整的数据行。

速度

由于数据行和索引在一起,所以在使用聚簇索引进行查询时,速度比非聚簇索引更快。

非聚簇索引

非聚簇索引是一种索引结构,它的叶子节点存储的是指向数据行的指针,而不是数据行本身。在MySQL中,普通索引就是一种非聚簇索引。

涉及情况

当查询需要按照非主键或非唯一索引进行查找时,会涉及到非聚簇索引。

数据结构

非聚簇索引的数据结构同样是B+树,但它的叶子节点存储的是指向数据行的指针。

速度

由于非聚簇索引的叶子节点存储的是指针而不是完整的数据行,所以在使用非聚簇索引进行查询时,速度相对较慢。

对比

  • 聚簇索引的叶子节点存储完整的数据行,速度更快,适合于按主键或唯一索引进行精确查找的情况,不需要回表。
  • 非聚簇索引的叶子节点存储的是指向数据行的指针,速度相对较慢,适合于按非主键或非唯一索引进行查找的情况,需要回表。

例子

假设有一个名为students的学生表,包含以下字段:

  • id (主键)
  • name
  • age
  • gender
  • class_id (班级ID)
sql 复制代码
CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    gender VARCHAR(10),
    class_id INT,
    INDEX idx_name (name),
    INDEX idx_class_id (class_id)
);

在这个例子中,id字段是主键,因此它将会作为聚簇索引。同时,我们创建了两个非聚簇索引,分别是按照name和class_id字段创建的索引。当进行按照name或class_id进行查询时,将会涉及到非聚簇索引的使用。

相关推荐
有想法的py工程师3 分钟前
PostgreSQL【内核】 CBO 优化器的“早停下注”与数学模型失效分析
数据库·postgresql
Apipi*4 分钟前
30天速通Linux 第九章Linux网络编程
linux·运维·网络
泡茶喝茶写代码5 分钟前
A股量化数据工程:从 REST 接口到策略信号(第 17 篇):创新高与新低扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
用户4603812919414 分钟前
别人都 commit 了,为什么我的 select 还是旧值?图解 MySQL MVCC
mysql
栗子~~15 分钟前
java - logstash-logback-encoder 集成 demo
java·开发语言·logback
报错小能手16 分钟前
Channel面试题。Sync面试题
linux·服务器·windows
冰暮流星21 分钟前
sql之计算
数据库·sql
xiaoqiMikko25 分钟前
Linux 实战(五):DNS、hosts、CLOSE-WAIT、SSH 权限与改端口 —— 三台真机实测
linux·centos
hmb↑27 分钟前
高并发与高可用技术经验
java·spring
Linux-lucky29 分钟前
43-Linux学习之旅之Shell 脚本(二)
linux·运维·学习·ubuntu·dash