【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. 查询优化原理
三、实战应用场景
1. 必须使用主键的场景
- 作为外键关联的基础
- 需要物理排序的业务(如时间线数据)
- 高频WHERE条件查询的列
2. 适合建索引的场景
-- 复合索引示例
ALTER TABLE orders ADD INDEX idx_status_created (status, created_at);
场景 | 索引类型建议 | 示例字段 |
---|---|---|
等值查询 | 普通索引 | user_id, order_no |
范围查询 | 复合索引 | created_at, price |
排序操作 | 覆盖索引 | 排序字段+查询字段 |
统计分组 | 复合索引 | group_type, region |
四、注意事项
-
索引代价:
- 写操作变慢(需维护索引结构)
- 占用额外存储空间
-
设计原则:
- 选择区分度高的列(如ID > 状态字段)
- 避免过度索引(一般不超过5-6个)
- 定期使用
EXPLAIN
分析查询计划
-
失效场景:
-- 索引失效案例 SELECT * FROM users WHERE LEFT(username,3) = 'abc'; -- 应改为: SELECT * FROM users WHERE username LIKE 'abc%';
五、性能对比测试
数据量 | 无索引查询 | 有索引查询 | 提升倍数 |
---|---|---|---|
10万行 | 1200ms | 5ms | 240x |
100万行 | 9500ms | 8ms | 1187x |
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张 | 可以有多个联系方式 |
作用 | 必须要有且不能重复 | 加速查找但非必须 |
代价 | 免费自带 | 需要额外维护 |
四、什么时候需要索引?
✅ 推荐场景
-
高频搜索:
👉 比如电商平台按"商品名称"搜索(给name字段加索引) -
排序需求:
👉 朋友圈按"发布时间"排序(给created_at加索引) -
重要约束:
👉 用户注册防重复手机号(给phone加唯一索引)
❌ 不推荐场景
-
很少查询的字段:
👎 像"用户血型"这种几乎不用的字段 -
频繁修改的字段:
👎 像"文章阅读数"这种每分钟都更新的字段
五、使用技巧
-
复合索引口诀:
👉 把最常用的查询条件放前面,就像"先查省→再查市"的快递地址 -
索引维护成本:
⚠️ 每新建一个索引就像多维护一份通讯录,会增加:- 存储空间(多占手机内存)
- 更新时间(新增联系人要同时更新多个通讯录)
-
实际效果测试:
🔍 用EXPLAIN命令查看,就像检查快递员是否真的用了最优路线