
SQL索引是一种专门用于加速数据检索的数据库对象,本质是**排好序的数据结构**,不是语法或命令,而是底层物理/逻辑组织方式。它不改变数据本身,只额外维护一份“快速路标”,让数据库不用每次都从头扫描整张表。
索引的核心作用:跳过无效行,直奔目标
没有索引时,WHERE name = '张三' 这类查询要逐行比对——全表扫描;有了索引,数据库能像查字典一样,根据键值直接定位到对应数据位置,把扫描行数从几万降到几条甚至1条。
- 加快 WHERE 条件过滤(等值、范围)、ORDER BY 排序、GROUP BY 分组
- 支持唯一性约束(如主键、UNIQUE 约束依赖唯一索引实现)
- 优化 JOIN 连接效率(尤其在外键列上建索引)
主流索引数据结构:B+Tree 是 InnoDB 的默认选择
MySQL InnoDB 引擎的索引全部基于 B+Tree 实现。它不是二叉树,而是一种多路平衡查找树,专为磁盘 I/O 优化设计:
- 所有真实数据(即整行记录)只存放在叶子节点,非叶子节点仅存索引键 + 指向子节点的指针
- 叶子节点之间用双向链表连接,天然支持高效范围查询(比如 age BETWEEN 20 AND 30)
- 树的高度通常只有 3~4 层,无论千万级数据,最多 3~4 次磁盘读取就能定位到数据
- 插入/更新时自动保持有序和平衡,但会带来写入开销(这是索引的代价)
其他常见索引类型及适用场景
不同引擎支持不同索引,选错类型反而拖慢性能:
- 哈希索引:Memory 引擎支持,等值查询极快(O(1)),但不支持范围、排序、模糊匹配;InnoDB 不原生提供
- 全文索引:用于 TEXT 类型字段的关键词搜索(MATCH ... AGAINST),基于倒排索引,适合文章、评论等场景
- 空间索引(R-Tree):处理地理坐标、多边形等空间数据,如 ST_Contains、ST_Distance 函数依赖它
- 前缀索引:对长字符串列(如 email)只索引前 N 个字符,节省空间,但可能降低区分度
什么时候该建索引?关键看查询模式
索引不是越多越好。重点覆盖高频、高选择性的查询路径:
- WHERE 子句中频繁出现的列(尤其是组合条件中的左前缀列)
- ORDER BY 或 GROUP BY 中的列(B+Tree 天然有序,可避免额外排序)
- 外键列(JOIN 时能显著减少连接成本)
- 主键自动创建聚簇索引,决定数据物理存储顺序
- 避免在低基数列建索引(如 gender、status 只有少数几个值),效果微弱还增加维护负担
索引是数据库性能的杠杆支点——用得准,查询飞起;建得滥,写入变卡,空间白占。理解它背后的 B+Tree 结构和使用边界,比死记语法重要得多。










