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

【MySQL 为什么默认会给 id 建索引? MySQL 主键索引 = 聚簇索引?】

MySQL 索引

MySQL 为什么默认会给 id 建索引? & MySQL 主键索引 = 聚簇索引?
结论:在 MySQL (InnoDB) 中,主键索引是自动创建的聚簇索引,不需要删除,其他索引是补充优化。

1. MySQL 的id 索引是怎么来的?

问题描述

发现数据库表中 id 字段默认有一个索引,并不清楚是怎么来的,或者是否应该删除这个索引?
在这里插入图片描述

核心解释
  • 在 MySQL 中,主键本质上就是一个索引,由数据库自动生成,用于确保唯一性和非空约束,同时优化查找效率。
  • 在 InnoDB 引擎中,主键还是 聚簇索引,决定数据的物理存储结构。
  • 因此,看到 id 自带索引是正常的、不需要删除。
官方引用
  • Vultr 文档:“定义主键时,MySQL 会自动创建索引。”

    Using Primary Keys, Indices, and Composite Keys in MySQL

  • MySQL 官方文档:主键是唯一索引,会被用作聚簇索引。

    CREATE TABLE Statement
    Clustered and Secondary Indexes

  • Stack Overflow:主键一定会被索引、聚簇索引与主键。

    Is the primary key automatically indexed in MySQL?
    Does MySQL create an extra index for primary key or uses the data itself as an “index”

2. MySQL 自动创建的 id 索引对项目有没有影响?

不会产生负面影响,反而是必须的。 原因如下:

  1. 主键索引是表的核心结构
    • 在 InnoDB 引擎下,主键索引是 聚簇索引,它决定了数据在磁盘上的物理存储顺序。
    • 这意味着:每一行数据在物理层面上是按照 id 排序存放的。
  2. 其他索引依赖主键
    • 定义的二级索引(如 idx_userId)在 InnoDB 中存储的其实是:userId → 主键 id 的映射。
    • 也就是说,MySQL 通过二级索引定位到主键 id,再通过聚簇索引找到实际的数据行。
    • 所以没有主键索引,二级索引都无法正常工作。
  3. 性能方面没有冲突
    • 主键索引只影响按 id 查找/排序的场景。
    • 自己定义的索引会在特定查询中生效(比如按 tagName 查找时会走唯一索引,按 userId 查找会走普通索引)。
    • 优化器会根据 SQL 选择最合适的索引,不会因为有主键索引就影响你额外建的索引。
  4. 例子
    -- 走主键索引
    select * from tag where id = 100; -- 走唯一索引 unidx_tagName
    select * from tag where tagName = 'Java';-- 走普通索引 idx_userId
    select * from tag where userId = 1;
    

总结

  • id 主键索引是 MySQL 自动创建的,必须存在,它是所有索引的基石。
  • 手动添加的唯一索引和普通索引是根据业务场景来优化查询的,它们和主键索引是 互补关系
  • 因此,不需要删除 MySQL 默认的 id 索引。相反,正确的做法是 在主键之外,根据实际查询场景设计合适的二级索引

3. 索引设计说明

在这个项目中,一共涉及了三个索引:

  1. 主键索引(MySQL 自动创建)id bigint auto_increment primary key
    1. 在 MySQL(InnoDB 引擎)中,主键会自动创建聚簇索引 (Clustered Index)
    2. 聚簇索引不仅保证了主键的唯一性和非空性,还决定了数据在磁盘上的物理存储顺序。
    3. 作用:每条记录都能通过主键索引快速定位,是表的基础结构。
  2. 唯一索引(手动创建)constraint unidx_tagName unique (tagName)
    1. 用于保证标签名的唯一性。
    2. 查询场景:当我通过标签名查找记录时,MySQL 优化器会优先走这个唯一索引。
  3. 普通索引(手动创建)create index idx_userId on tag (userId);
    1. 用于加速用户维度下的标签查询。
    2. 查询场景:比如获取某个用户的所有标签时,走这个索引会比全表扫描快很多。

4. 补充

面试鸭:MySQL InnoDB引擎中的聚簇索引和非聚簇索引有什么区别?
其他博客:MySQL 聚簇索引和非聚簇索引的区别

简单总结

特性聚簇索引 (Clustered Index)非聚簇索引 (Secondary Index)
存储结构数据行按主键顺序存储只存储索引列 + 主键值
数据定位直接定位到数据行先找到主键 → 再回表查数据
数量每个表只能有一个可以有多个
示例PRIMARY KEY (id)INDEX (userId)、UNIQUE (tagName)
http://www.xdnf.cn/news/19148.html

相关文章:

  • 【实战】连锁商超出口网络割接项目案例分享
  • 从CTFshow-pwn入门-pwn43理解栈溢出到底跳转call还是plt
  • 【Word】用 Python 轻松实现 Word 文档对比并生成可视化 HTML 报告
  • 深入 OpenHarmony 内核:设备待机管理模块的休眠调度与资源节能技术
  • 【SpringBoot 版本升级整合Redis异常解决】Unable to connect to 127.0.0.1:6379
  • 5G核心网的架构和功能详解
  • 浏览器访问 ASP.NET Core wwwroot 目录下静态资源的底层实现
  • 新手向:Python编写简易翻译工具
  • 实时标注+硬件加速 | Bandicam 8.2 屏幕录制软件特色功能
  • 局域网共享访问各种报错全记录:从「能 ping 不能进」到「IP/名称差异」一次说清
  • OpenAI重组受阻:微软“锁链”与生态博弈
  • 从 WPF 到 Avalonia 的迁移系列实战篇3:ResourceDictionary资源与样式的差异与迁移技巧
  • 使用 httpsok 工具全面排查网站安全配置
  • @HAProxy 介绍部署使用
  • Copilot、Cursor、Trae、ChatGPT 的“四件套”场景选择表
  • 5G相对于4G网络的优化对比
  • 卷积神经网络实现mnist手写数字集识别案例
  • 三、计算机网络与分布式系统(上)
  • Linux DNS配置文件resolv.conf简介
  • Centos 8 磁盘扩展xfs文件系统 (LVM)
  • 云计算学习100天-第32天
  • 1-ATSAMV71Q21
  • 大模型后训练——Online-RL实践
  • DistributedLock 实现.Net分布式锁
  • 智能养花谁更优?WebIDE PLOY技术与装置的结合及实践价值 —— 精准养护的赋能路径
  • 北斗导航 | 工信部印发《关于优化业务准入促进卫星通信产业发展的指导意见》解析
  • MySQL数据库精研之旅第十三期:吃透用户与权限管理,筑牢数据库安全第一道防线
  • 【MySQL数据库】存储引擎 学习记录
  • 高光谱成像在食品质量和安全检测中的应用
  • 【C++游记】子承父业——乃继承也