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

【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.dtcms.com/a/355694.html

相关文章:

  • 数据结构:排序算法的评判标准(Criteria Used For Analysing Sorts)
  • 打靶日记-SQLi-LABS(一)
  • C++防御性编程策略
  • RGW层Op的组织
  • 并发编程——05 并发锁机制之深入理解synchronized
  • 优雅地实现ChatGPT式的打字机效果:Spring Boot 流式响应
  • Jtekt深沟球轴承外圈防跑圈开发
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-图像颜色模式转换与应用
  • [网鼎杯 2018]Fakebook
  • 基础IO详解
  • 【前端教程】JavaScript 基础总结
  • 教育类《河北教育》杂志简介
  • Day03_苍穹外卖——公共字段自动填充菜品相关功能
  • 河南萌新联赛2025第(七)场:郑州轻工业大学
  • 【数据结构与算法】(LeetCode)141.环形链表 142.环形链表Ⅱ
  • 数据分析学习笔记4:加州房价预测
  • 国产的服务器
  • 如何监控PCIe 5.0 SSD的运行温度?多软件推荐
  • 中国剩余定理(以及扩展..)
  • 用 Docker 玩转 Kafka 4.0镜像选型、快速起步、配置持久化与常见坑
  • 影楼精修-锁骨增强算法
  • 深入理解 PHP 中的 `pcntl_fork()`:父进程与子进程的执行路径
  • SRE网易一面面经
  • Linux笔记12——shell编程基础-6
  • 少样本图异常检测系列【A Survey of Few-Shot Graph Anomaly Detection】
  • Python实战:银行ATM系统开发全解析
  • RuoYi-VuePlus:前端指定接口不显示错误提示
  • 面试tips--JVM(2)--对象创建的过程
  • ERNIE-4.5-VL:技术解密+应用实战,解锁多模态新场景!
  • 8.29 贪心|摩尔投票