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进行查询时,将会涉及到非聚簇索引的使用。

相关推荐
程序猿编码2 分钟前
轻量又灵活:一款伪造TCP数据包的iptables扩展实现解析(C/C++代码实现)
linux·c语言·网络·c++·tcp/ip·内核·内核模块
IT痴者2 分钟前
Kotlin 开发注意事项(Android Java 开发者转型指南)
android·java·kotlin
老虎06273 分钟前
Spring mysql 网络接口( HTTP 方法与增删改查, Spring MVC Controller 接收参数的常用注解与参数传递方式)
mysql·spring·http
wuqingshun3141595 分钟前
产生死锁的四个必要条件
java·jvm
青槿吖5 分钟前
第二篇:Spring MVC进阶:注解、返回值与参数接收的花式玩法
java·开发语言·后端·mysql·spring·mvc·mybatis
_OP_CHEN6 分钟前
【Linux网络编程】(二)计算机网络概念进阶:彻底搞懂协议本质、传输流程与封装分用
linux·运维·服务器·网络·网络协议·计算机网络·c/c++
风曦Kisaki6 分钟前
# 云计算基础Day06:Linux权限管理
linux·云计算
共享家95276 分钟前
Java入门(抽象类 与 接口)
java·开发语言
hanbr7 分钟前
C++ string类模拟实现(完整版,含全运算符重载)
java·开发语言
运维 小白7 分钟前
4. 部署postgresql服务并监控postgresql
数据库·postgresql