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字段是主键,因此它将会作为聚簇索引。同时,我们创建了两个非聚簇索引,分别是按照nameclass_id字段创建的索引。当进行按照nameclass_id进行查询时,将会涉及到非聚簇索引的使用。

相关推荐
luck_me5几秒前
k8s v1.26 实战csi-nfs 部署
linux·docker·云原生·容器·kubernetes
不摆烂选手1 分钟前
Linux 阻塞和非阻塞 I/O 简明指南
linux·驱动开发·ubuntu·正点原子imx6ull学习笔记
Mcworld8574 分钟前
整数分解JAVA
java·开发语言
我来整一篇14 分钟前
用Redis的List实现消息队列
数据库·redis·list
SweerItTer25 分钟前
由镜像源配置错误导致的软件包依赖问题
linux·vscode·ubuntu
小南家的青蛙30 分钟前
LeetCode面试题 01.09 字符串轮转
java·leetcode
kedvellek32 分钟前
Linux 内核链表宏的详细解释
linux·运维·链表
加什么瓦35 分钟前
Redis——数据结构
数据库·redis·缓存
神仙别闹35 分钟前
基于C#+SQL Server开发(WinForm)租房管理系统
数据库·oracle·c#
秋野酱44 分钟前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端