当前位置: 首页 > news >正文

关于聚簇索引

目录

      • **核心特性**
      • **与非聚簇索引(二级索引)的区别**
      • **优点**
      • **缺点**
      • **示例场景**
      • **设计建议**

聚簇索引(Clustered Index)是 一种将数据行物理存储顺序与索引键值逻辑顺序紧密结合的索引结构。在 MySQL 的 InnoDB 引擎中,聚簇索引直接决定了表中数据的物理排列方式,因此每个表有且只有一个聚簇索引。


核心特性

  1. 数据即索引
    聚簇索引的叶子节点直接存储完整的数据行,而非指向数据的指针。这意味着找到索引即找到数据,无需二次查找。

  2. 主键默认成为聚簇索引

    • 若表定义了主键(PRIMARY KEY),InnoDB 自动将其作为聚簇索引。
    • 若无主键,则选择第一个**唯一且非空(UNIQUE NOT NULL)**的列作为聚簇索引。
    • 若两者均无,InnoDB 会隐式生成一个隐藏的 ROW_ID 作为聚簇索引。
  3. 物理有序存储
    数据行按聚簇索引键值的顺序存储在磁盘页中。范围查询(如 BETWEENORDER BY)效率高,因为相邻键值的数据物理相邻。


与非聚簇索引(二级索引)的区别

特性聚簇索引非聚簇索引(二级索引)
存储内容数据行本身索引键值 + 对应主键(或ROW_ID)
查询流程直接命中数据先查索引获取主键,再回表查聚簇索引
数量限制每个表仅一个可创建多个
依赖关系独立存在依赖聚簇索引(需通过主键定位数据)

优点

  • 高效的主键查询:直接定位数据行,无需额外I/O。
  • 快速范围查询:连续键值的数据物理相邻,减少磁盘寻道时间。
  • 覆盖索引优化:若查询字段全部属于聚簇索引键,无需回表。

缺点

  • 插入依赖顺序:若主键非自增(如随机UUID),插入可能导致页分裂,降低写入性能。
  • 更新主键代价高:修改聚簇索引键值时,需移动整行数据。
  • 二级索引查询需回表:通过二级索引查询非索引字段时,需额外回表操作。

示例场景

假设用户表 users 结构如下:

CREATE TABLE users (id INT PRIMARY KEY,          -- 聚簇索引email VARCHAR(100) UNIQUE,name VARCHAR(50),INDEX idx_email (email)       -- 二级索引
);
  • 通过 id 查询(聚簇索引):
    直接访问聚簇索引叶子节点,立即获取数据行。

  • 通过 email 查询(二级索引):

    1. idx_email 中找到对应 emailid
    2. 用此 id 回表查询聚簇索引,获取完整数据行。

设计建议

  1. 优先使用自增主键(如 AUTO_INCREMENT),避免随机写入导致的页分裂。
  2. 避免频繁更新主键,减少数据移动开销。
  3. 谨慎选择聚簇索引键,通常主键应满足高频查询、有序插入的需求。

通过合理利用聚簇索引,可以显著优化查询性能,但需结合业务场景权衡插入和更新操作的效率。

http://www.xdnf.cn/news/156421.html

相关文章:

  • 【软考-架构】13.5、中间件
  • Linux——动静态库
  • WPF 实现PLC数据采集
  • 如何打包python程序为可执行文件
  • linux中shell脚本的编程使用
  • 一台服务器已经有个python3.11版本了,如何手动安装 Python 3.10,两个版本共存
  • deepseek-cli开源的强大命令行界面,用于与 DeepSeek 的 AI 模型进行交互
  • Pygame音效与音乐:为你的游戏注入灵魂
  • LLaMa Factory大模型微调
  • shell语言核心语法
  • RabbitMQ全栈实践手册:从零搭建消息中间件到SpringAMQP高阶玩法
  • 数据结构和算法(九)--红黑树
  • C++?类和对象(下)!!!
  • 精益数据分析(27/126):剖析用户价值与商业模式拼图
  • 观察者模式 (Observer Pattern)
  • 游戏引擎学习第246天:将 Worker 上下文移到主线程创建
  • 如何给GitHub项目提PR(踩坑记录
  • windows下查看idea运行的进程占的JVM情况工具
  • olama部署deepseek模型
  • 从后端研发角度出发,使用k8s部署业务系统
  • gradle-缓存、依赖、初始化脚本、仓库配置目录详解
  • SpringBoot实现的后端开发
  • Ubuntu20.04 Ollama 配置相关
  • c++初始化数组
  • C语言中位段的应用
  • 【教程】Docker运行gitlab容器
  • 数据结构和算法(八)--2-3查找树
  • 什么时候使用Python 虚拟环境(venv)而不用conda
  • Qt软件开发-摄像头检测使用软件V1.1
  • python 与Redis操作整理