索引(Index)是数据库优化的重要手段,加快查询、降低I/O,但也有代价(增加写入成本、占用空间)。设计索引时要考虑业务场景、查询模式、数据量和更新频率。
🔎 一、索引的核心作用:
- 快速定位数据(加快查询速度)
- 减少磁盘I/O
- 提高排序、分组、聚合性能
🔎 二、建立索引的核心考虑因素
考虑维度 | 具体建议 |
---|---|
✅ 查询频率 | 高频查询字段优先建索引(如搜索条件 WHERE 中常用字段) |
✅ 区分度(选择性) | 选择性高(唯一性强)字段建索引效果好,如手机号、身份证号 |
✅ 联合索引顺序 | 优先把区分度高的字段放在前面,满足最左前缀原则 |
✅ 覆盖查询 | 通过索引能直接返回需要的字段,减少回表 |
✅ 避免小表建索引 | 小表全表扫描反而快,索引收益小 |
✅ 更新频率低 | 频繁更新、插入的字段慎建索引,避免增加维护成本 |
✅ 避免在经常变化的字段建索引 | 如状态字段不断变化,维护代价大 |
✅ 避免在大文本、BLOB字段上建索引 | 性能低下,占用空间大 |
🔎 三、联合索引设计要点(面试高频)
- 遵循 最左前缀原则:
- 建
(a, b, c)
联合索引 - 支持
(a)
、(a, b)
、(a, b, c)
查询 - 不支持
(b)
、(b, c)
- 建
- 尽量让 过滤性强的字段靠前,减少扫描数据量
🔎 四、哪些场景不适合建索引?
- 数据量小、查询简单的表
- 经常变动的字段(如频繁更新的状态、计数等字段)
- WHERE 过滤条件中极少使用的字段
- 低区分度字段(如性别、是否删除标识)
- 超大字段(text/blob/json)
🔎 五、索引类型(MySQL为例)
类型 | 说明 |
---|---|
普通索引(Index) | 最基础的索引,加速查询 |
唯一索引(Unique) | 保证唯一性 + 加速查询 |
主键索引(Primary Key) | 主键默认建立唯一索引 |
全文索引(FullText) | 适用于大文本全文搜索(MyISAM引擎) |
复合索引(联合索引) | 多个字段组成,提高多条件查询效率 |
🔎 六、面试高分回答模板:
建立索引时主要考虑字段的查询频率、区分度(选择性)、更新频率和业务场景。优先给高频查询且区分度高的字段建索引,设计联合索引时遵循最左前缀原则,并兼顾覆盖索引优化查询性能。同时避免在小表、低区分度或频繁更新的字段上盲目建索引,综合权衡查询与写入性能。
🔎 七、实战经验总结:
✅ 数据量大且稳定的核心业务表,索引优化收益最大
✅ 善用 EXPLAIN 分析SQL走不走索引
✅ 索引=双刃剑,读快、写慢,设计时结合业务需求、访问模式综合考虑