一、索引的本质与核心作用
1.定义
索引是数据库中加速查询的特殊数据结构,类比书籍的目录,通过在表的列上创建索引,能快速定位数据行,避免全表扫描。
2.核心作用
- 提升查询效率:这是最核心的作用,大幅减少数据库检索数据的IO操作。
- 保证数据唯一性:如主键索引、唯一索引可约束字段值的唯一性。
- 优化排序/分组:索引的有序性可减少查询中排序( ORDER BY )、分组( GROUP BY )的计算量。
二、索引的分类
| 索引类型 | 定义 | 核心特点 | 适用场景 | 举例 |
|---|---|---|---|---|
| 主键索引 | 基于主键字段创建的索引 | 自动创建、唯一、不允许为空 | 表的唯一标识字段 | 用户表(user)的id字段,唯一标识每个用户 |
| 唯一索引 | 确保索引列值唯一 | 防止重复,允许一个空值 | 需唯一约束但非主键的字段 | 用户表的phone字段,避免重复手机号 |
| 普通索引 | 基础的查询加速索引 | 无唯一性限制,可建在任意列 | 普通查询的非唯一字段 | 商品表的category字段,按分类查商品 |
| 全文索引 | 用于全文搜索的索引 | 支持复杂文本检索,适配大文本 | 长文本字段的模糊/关键词搜索 | 文章表的content字段,搜索包含"数据库"的文章 |
| 复合索引 | 基于多个列创建的索引 | 加速多列联合查询 | 多字段组合查询的场景 | 订单表的 user_id + create_time,按用户 + 时间查订单 |
三、索引的使用方法(以MySQL为例)
1.创建索引
sql
-- 主键索引(建表时自动创建,也可手动指定)
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
-- 唯一索引
CREATE UNIQUE INDEX idx_user_phone ON user(phone);
-- 普通索引
CREATE INDEX idx_goods_category ON goods(category);
-- 全文索引(仅MyISAM/InnoDB 5.6+支持)
CREATE FULLTEXT INDEX idx_article_content ON article(content);
-- 复合索引
CREATE INDEX idx_order_user_time ON `order`(user_id, create_time);
2.删除索引
sql
DROP INDEX idx_user_phone ON user;
四、索引的优缺点
优点
- 查询提速:针对大规模数据,能将查询效率从O(n)降至O(log n)(B+树索引)。
- 数据约束:主键/唯一索引可保证数据完整性,避免重复值。
- 减少IO:通过索引定位数据,减少磁盘的物理读写次数。
缺点
- 写入性能下降:新增、修改、删除数据时,需同步维护索引结构,额外消耗资源。
- 占用存储空间:索引是独立的数据结构,会占用数据库的磁盘空间(如B+树索引的叶节点/非叶节点存储)。
- 维护成本高:过多索引会增加数据库的维护负担,且复合索引需遵循"最左匹配原则",使用不当会失效。
五、索引使用的关键注意事项
- 避免过度建索引:仅在常用查询字段上创建,非查询字段无需建索引。
- 复合索引遵循最左匹配:如 (a,b,c) 的索引,仅 a 、 a+b 、 a+b+c 的查询能命中, b 、 c 单独查询则失效。
- 小表无需建索引:数据量少时,全表扫描的效率可能高于索引查询。
- 更新频繁的字段慎建索引:如订单状态字段,频繁修改会导致索引频繁维护,抵消查询收益。