全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-15 6 分钟 ✍️ juanwangdev

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 结构,加速查询效率
  • 主键自动创建索引,普通索引手动创建
  • 高频查询、排序、分组字段适合建索引
  • 索引有存储和维护代价,需权衡使用

📝 发现内容有误?点击此处直接编辑

← 上一篇 MySQL 索引优化策略
下一篇 → MySQL 索引类型
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库