MySQL 索引基础
索引是数据库中用于加速查询的数据结构,类似书籍目录,可大幅减少数据检索时间。
索引的作用
| 作用 | 说明 |
|---|---|
| 加速查询 | 减少扫描行数 |
| 加速排序 | 利用索引有序性 |
| 加速分组 | 减少临时表 |
| 唯一约束 | 保证数据唯一 |
索引原理
MySQL 使用 B+Tree 作为索引结构:
- 非叶子节点存储索引键值和指针
- 叶子节点存储完整数据或指针
- 叶子节点形成有序链表,支持范围查询
SQL
-- B+Tree结构示意
根节点 → [10, 20, 30]
↓ ↓ ↓
中间层 → [5,10] [15,20] [25,30]
↓ ↓ ↓ ↓ ↓ ↓
叶子层 → 数据页(有序链表)
创建索引
SQL
-- 创建表时定义索引
CREATE TABLE users (
id INT PRIMARY KEY, -- 主键自动创建索引
name VARCHAR(50),
email VARCHAR(100),
INDEX idx_name (name), -- 普通索引
UNIQUE idx_email (email) -- 唯一索引
);
-- 在已有表上创建索引
CREATE INDEX idx_name ON users(name);
CREATE UNIQUE INDEX idx_email ON users(email);
-- ALTER方式添加索引
ALTER TABLE users ADD INDEX idx_name (name);
ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
删除索引
SQL
-- 删除索引
DROP INDEX idx_name ON users;
-- ALTER方式删除
ALTER TABLE users DROP INDEX idx_name;
-- 查看表索引
SHOW INDEX FROM users;
索引使用场景
SQL
-- 适合建索引
-- 1. 经常作为查询条件的字段
SELECT * FROM users WHERE name = '张三';
-- name字段适合建索引
-- 2. 经常排序/分组的字段
SELECT * FROM users ORDER BY create_time;
-- create_time适合建索引
-- 3. 表数据量大(>1000行)
-- 小表全表扫描更快
-- 不适合建索引
-- 1. 数据量小的表
-- 2. 频繁更新的字段
-- 3. 区分度低的字段(如性别、状态)
SELECT * FROM users WHERE gender = 'M';
-- gender只有两种值,索引效果差
索引代价
text
-- 索引有代价,需权衡
-- 1. 存储空间
-- 每个索引占用额外磁盘空间
-- 2. 写入性能
-- INSERT/UPDATE/DELETE需维护索引
INSERT INTO users (name) VALUES ('张三');
-- 需更新idx_name索引
-- 3. 维护成本
-- 索引过多影响整体性能
索引不是越多越好,需根据查询场景合理设计。
要点总结
- 索引基于 B+Tree 结构,加速查询效率
- 主键自动创建索引,普通索引手动创建
- 高频查询、排序、分组字段适合建索引
- 索引有存储和维护代价,需权衡使用
📝 发现内容有误?点击此处直接编辑