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

【EasyPan】MySQL主键与索引核心作用解析

【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版

MySQL主键与索引核心作用解析

一、主键(PRIMARY KEY)核心作用

1. 数据唯一标识

-- 创建表时定义主键
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL
);
  • 唯一性约束:确保每行数据有唯一标识符
  • 非空约束:主键列不允许NULL值
  • 物理排序:InnoDB按主键顺序组织存储(聚簇索引)

2. 性能优化

场景效果
WHERE条件查询直接定位到数据页
关联查询(JOIN)快速匹配关联表数据
范围查询利用B+树的有序特性加速

二、索引(INDEX)核心作用

1. 基础索引类型

-- 创建普通索引
CREATE INDEX idx_email ON users(email);-- 创建唯一索引
CREATE UNIQUE INDEX uq_username ON users(username);

2. 核心功能对比

功能主键普通索引唯一索引
唯一性✅ 强制❌ 不保证✅ 强制
NULL值❌ 不允许✅ 允许✅ 允许(但仅限NULL)
数量限制每表1个每表多个每表多个
自动创建自动创建聚簇索引需手动创建需手动创建

3. 查询优化原理

使用索引
无索引
SQL查询
查询分析器
索引扫描
全表扫描
快速定位数据
逐行检查

三、实战应用场景

1. 必须使用主键的场景

  • 作为外键关联的基础
  • 需要物理排序的业务(如时间线数据)
  • 高频WHERE条件查询的列

2. 适合建索引的场景

-- 复合索引示例
ALTER TABLE orders ADD INDEX idx_status_created (status, created_at);
场景索引类型建议示例字段
等值查询普通索引user_id, order_no
范围查询复合索引created_at, price
排序操作覆盖索引排序字段+查询字段
统计分组复合索引group_type, region

四、注意事项

  1. 索引代价

    • 写操作变慢(需维护索引结构)
    • 占用额外存储空间
  2. 设计原则

    • 选择区分度高的列(如ID > 状态字段)
    • 避免过度索引(一般不超过5-6个)
    • 定期使用EXPLAIN分析查询计划
  3. 失效场景

    -- 索引失效案例
    SELECT * FROM users WHERE LEFT(username,3) = 'abc';
    -- 应改为:
    SELECT * FROM users WHERE username LIKE 'abc%';
    

五、性能对比测试

数据量无索引查询有索引查询提升倍数
10万行1200ms5ms240x
100万行9500ms8ms1187x


MySQL主键与索引的生活化解释

一、主键:就像身份证号

1. 基本特性

  • 🆔 唯一标识:每个学生学号、每张快递单号都不重复
  • 🚫 不能为空:就像"无名氏"不能办银行卡
  • 📌 快速定位:快递员凭单号秒找包裹(数据库凭主键秒查数据)

2. 生活场景

[图书馆管理系统]
├── 书号_PK001 --> 《三体》 --> A区3架2层
├── 书号_PK002 --> 《小王子》 --> B区1架5层
└── 书号_PK003 --> 《红楼梦》 --> C区2架3层
  • 书号=主键,能快速找到具体书籍

二、索引:就像字典目录

1. 普通索引(新华字典拼音查字法)

-- 给"学生姓名"加索引
ALTER TABLE students ADD INDEX idx_name (name);
  • 📖 快速查找:不用翻完整本字典,直接查"李"字在哪页
  • 🔍 多本目录:可以同时有拼音索引、偏旁部首索引

2. 唯一索引(公司工牌系统)

-- 防止重复手机号
CREATE UNIQUE INDEX uq_phone ON customers (phone);
  • 👔 防重复:就像公司不允许两个员工用同一个工号
  • ⚠️ 特殊规则:允许"未登记"(NULL),但不允许重复登记

三、主键vs索引的区别

主键索引
类比身份证通讯录
数量每人只有1张可以有多个联系方式
作用必须要有且不能重复加速查找但非必须
代价免费自带需要额外维护

四、什么时候需要索引?

✅ 推荐场景

  1. 高频搜索
    👉 比如电商平台按"商品名称"搜索(给name字段加索引)

  2. 排序需求
    👉 朋友圈按"发布时间"排序(给created_at加索引)

  3. 重要约束
    👉 用户注册防重复手机号(给phone加唯一索引)

❌ 不推荐场景

  1. 很少查询的字段
    👎 像"用户血型"这种几乎不用的字段

  2. 频繁修改的字段
    👎 像"文章阅读数"这种每分钟都更新的字段

五、使用技巧

  1. 复合索引口诀
    👉 把最常用的查询条件放前面,就像"先查省→再查市"的快递地址

  2. 索引维护成本
    ⚠️ 每新建一个索引就像多维护一份通讯录,会增加:

    • 存储空间(多占手机内存)
    • 更新时间(新增联系人要同时更新多个通讯录)
  3. 实际效果测试
    🔍 用EXPLAIN命令查看,就像检查快递员是否真的用了最优路线

相关文章:

  • 助conda命令把环境导出为一个文件,然后在 Linux 系统里利用该文件重新创建相同的环境
  • 广东省大模型备案材料之测试题合格率判断标准
  • 【英语语法】词法---数词
  • 论文速报《CAL: 激光雷达中的零样本对象形状补全》
  • Deep Norm
  • spark–sql项目实验
  • 固定资产全生命周期管理:采购至报废的高效管理路径
  • Java第六节:创建线程的其它三种方式(附带源代码)
  • aws文件存储服务——S3介绍使用代码集成
  • JFrog Artifactory 制品库命令行操作指南
  • 模数转换【1】AD7699
  • MySQL知识点讲解
  • 【软件工程】软件测试基础知识
  • MYDB仿MySQL手写数据库项目总结
  • 【Maven】项目管理工具
  • 深度学习-全连接神经网络-2
  • Rust: 从内存地址信息看内存布局
  • 问题 | RAIM + LSTM 你怎么看???
  • Day5-UFS总结
  • WPS科大讯飞定制版 11.4.1.5| 无广告,省电和降低占用,可与普通版本共存
  • 林毅夫:中美经济确有脱钩风险,但“完全脱钩”可能性不大
  • 上海市政府常务会议部署多措并举促进消费,提高居民收入,减轻家庭负担
  • 第1现场|俄乌互指对方违反复活节临时停火提议
  • 上海农房翻建为何难?基层盼政策适度松动
  • 重大虚开发票偷税骗补案被查处:价税2.26亿,涉700余名主播
  • 从6家试点扩展至全行业,券商并表监管有何看点?