【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.pswp.cn/pingmian/94593.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[光学原理与应用-321]:皮秒深紫外激光器产品不同阶段使用的工具软件、对应的输出文件

在皮秒深紫外激光器的开发过程中,不同阶段使用的工具软件及其对应的输出文件如下:一、设计阶段工具软件:Zemax OpticStudio:用于光学系统的初步设计和仿真,包括光线追迹、像差分析、优化设计等。MATLAB:用于…

openEuler常用操作指令

openEuler常用操作指令 一、前言 1.简介 openEuler是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持ARM、x86、RISC-V、loongArch、PowerPC、SW…

Python爬虫实战:构建网易云音乐个性化音乐播放列表同步系统

1. 引言 1.1 研究背景 在数字音乐生态中,各大音乐平台凭借独家版权、个性化推荐等优势占据不同市场份额。根据国际唱片业协会(IFPI)2024 年报告,全球流媒体音乐用户已突破 50 亿,其中超过 60% 的用户同时使用 2 个及以上音乐平台。用户在不同平台积累的播放列表包含大量…

vscode 配置 + androidStudio配置

插件代码片段 饿了么 icon{"Print to console": {"prefix": "ii-ep-","body": ["i-ep-"],"description": "elementPlus Icon"} }Ts 初始化模版{"Print to console": {"prefix": &q…

DQN(深度Q网络):深度强化学习的里程碑式突破

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! ✨ 1. DQN概述:当深度学习遇见强化学习 DQN(D…

个人博客运行3个月记录

个人博客 自推一波,目前我的Hexo个人博客已经优化的足够好了, 已经足够稳定的和简单进行发布和管理,但还是有不少问题,总之先记下来再说 先总结下 关于评论系统方面,我从Waline (快速上手 | Waline) 更换成了&#x…

C89标准关键字以及运算符分类汇总

开发单片机项目学好C语言尤其重要,我感觉学习C语言需要先学好关键字和运算符,我对C语言的关键字和运算符做一下汇总。一、关键字:(C89标准一共有32个关键字)(1) 数据类型关键字(一共12个,分为基…

吱吱企业通讯软件打破跨部门沟通壁垒,为企业搭建安全的通讯环境

在数字化转型浪潮中,企业通讯软件不再仅仅作为企业跨部门沟通桥梁,更是承载着保护通讯数据安全的使命。吱吱企业通讯凭借其“私有化部署全链路加密”双重机制,为企业构建了一套“沟通便捷、通讯安全”的数字化通讯解决方案。 一、打破沟通壁垒…

Day16_【机器学习建模流程】

一、机器学习建模流程:获取数据(搜集与完成机器学习任务相关的数据集)数据基本处理(数据 缺失值处理,异常值处理)特征工程(特征提取、特征预处理 、特征降维、特征选择 、特征组合)机…

【不说废话】pytorch中.to(device)函数详解

1. 这个函数是什么? .to(device) 是 PyTorch 中一个用于张量和模型在设备(CPU 或 GPU)之间移动的核心函数。这里的 “设备” (device) 通常指的是计算发生的硬件位置,最常见的是: CPU&#xff1…

基于matplotlib库的python可视化:以北京市各区降雨量为例

一、实验目的1. 掌握使用Python的pandas、matplotlib和seaborn库进行数据可视化的方法 2. 学习制作杠铃图、堆积柱状图和折线图等多种图表类型 3. 分析北京市各区在特定时间段内的降雨量的变化规律 4. 培养数据分析和可视化的实践能力二、实验数据数据来源:北京市水…

SCDN如何提示网站性能和安全防护

SCDN(Secure Content Delivery Network,安全内容分发网络)是融合了传统 CDN(内容分发网络)性能加速能力与专业安全防护能力的新一代网络服务,核心目标是在 “快速分发内容” 的基础上,同步解决网…

PowerShell远程加载Mimikatz完全指南:从原理到实战

PowerShell远程加载Mimikatz完全指南:从原理到实战无文件攻击技术是现代渗透测试的核心技能,掌握PowerShell远程加载Mimikatz对白帽子黑客至关重要1 引言 在当今的网络安全领域,无文件攻击(fileless attack)已成为高级持久性威胁(APT)的主要手…

基于Spring Boot的民宿服务管理系统-项目分享

基于Spring Boot的民宿服务管理系统-项目分享项目介绍项目摘要系统总体结构图民宿资讯信息实体图项目预览民宿信息管理页面民宿咨询管理页面已支付订单管理页面用户主页面写在最后项目介绍 使用者:管理员、用户 开发技术:MySQLJavaSpringBootVue 项目摘…

SpringBoot基础知识-从XML配置文件到Java Config

项目结构与依赖首先&#xff0c;我们需要添加 Spring 核心依赖&#xff1a;<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version> </dependency>项目…

用无标签语音自我提升音频大模型:SI-SDA 方法详解

用无标签语音自我提升音频大模型:SI-SDA 方法详解 在语音识别和处理领域,近年来大模型(Large Language Models, LLMs)的发展迅速,为语音任务带来了新的突破。然而,语音信号的复杂性使得这些模型在特定领域中表现不佳。如何在没有标注数据的情况下提升音频大模型的表现?…

开源工具新玩法:cpolar提升Penpot协作流畅度

文章目录前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动Penpot容器3. 本地使用Penpot进行创作4. 公网远程访问本地Penpot4.1 内网穿透工具安装4.2 创建远程连接公网地址5. 固定Penpot公网地址前言 你是否也曾因商业设计软件的高昂费用而放弃团队协作&#xff1f;或者…

DINOv2 vs DINOv3 vs CLIP:自监督视觉模型的演进与可视化对比

近年来&#xff0c;自监督学习在计算机视觉领域取得了巨大进展&#xff0c;推动了无需人工标注即可学习强大视觉表示的视觉基础模型&#xff08;Vision Foundation Models&#xff09;的发展。其中&#xff0c;DINOv2 和 CLIP 是两个极具影响力的代表性工作&#xff0c;而最新的…

并发编程——05 并发锁机制之深入理解synchronized

1 i/i--引起的线程安全问题 1.1 问题思考&#xff1a;两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;结果是 0 吗&#xff1f; public class SyncDemo {private static int counter 0;public static void increment()…

数字接龙(dfs)(蓝桥杯)

非常好的联系dfs的一道题目&#xff01; 推荐看这位大佬的详解——>大佬详细题解 #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std;const int N 2e5 10,M20; int a[M][M]; bool val[M][M]; i…