sql索引是排好序的数据结构,用于加速检索,核心原理是通过索引快速定位键值再指针寻址,以空间换时间;支持b+tree、哈希、全文、空间等类型,分聚集与非聚集两类,建索引需考虑查询频次、选择性和列组合。

SQL索引是一种专门用于加速数据检索的数据库对象,本质是**排好序的数据结构**,作用就像字典的目录——不用逐页翻找,直接跳到目标位置。
索引的核心原理
没有索引时,数据库执行查询要扫描整张表(全表扫描),行数越多越慢;有了索引,数据库先在轻量级的索引结构中快速定位键值,再通过指针找到对应的数据行,大幅减少磁盘I/O和CPU计算量。
- 索引以“空间换时间”:额外占用存储空间,写入数据(INSERT/UPDATE/DELETE)时需同步更新索引,带来一定开销
- 查询优化器决定是否使用索引:不是建了就一定用,还要看查询条件、数据分布、统计信息是否准确
- 索引列顺序很重要:联合索引 (a, b, c) 能高效支持 a、(a,b)、(a,b,c) 的查询,但对 b 或 (b,c) 通常无效
主流索引数据结构
不同数据库引擎采用不同底层结构,InnoDB(MySQL默认)和 SQL Server 主要用 B+Tree;Memory 引擎支持哈希索引;全文搜索依赖倒排索引。
- B+Tree 索引:所有数据只存于叶子节点,非叶子节点仅存键值和指针;叶子节点按顺序链接,天然支持等值查询、范围查询(如 >、BETWEEN)、ORDER BY 和 GROUP BY
- 哈希索引:基于哈希表,等值查询极快(平均 O(1)),但不支持范围、排序或前缀匹配(如 LIKE 'abc%')
- 全文索引:针对文本内容构建倒排索引,支持自然语言搜索(MATCH ... AGAINST),适合文章、评论等字段
- 空间索引(R-Tree):专为地理坐标、多边形等空间数据设计,用于 ST_CONTAINS、ST_WITHIN 等GIS操作
聚集索引与非聚集索引的区别
这是理解物理存储的关键。是否“聚集”,取决于索引是否决定了数据行在磁盘上的实际存放顺序。
- 聚集索引:叶子节点直接存储完整的数据行;一张表只能有一个(因为数据物理顺序唯一);主键索引默认就是聚集索引(InnoDB)
- 非聚集索引:叶子节点只存索引键 + 指向数据行的指针(InnoDB 中是主键值,回表需二次查找);可建多个;适合高频查询但不修改的列
什么时候该建索引
不能盲目创建,重点考虑查询频次高、选择性好(重复值少)、常用于 WHERE / JOIN / ORDER BY / GROUP BY 的列。
- 高选择性字段优先:如 user_id、order_no;避免对 gender、status 这类低基数列单独建索引
- WHERE 条件中频繁出现的组合列,考虑联合索引,并按最常用过滤顺序排列
- 外键列建议加索引:显著提升 JOIN 性能
- 注意冗余索引:(a) 和 (a,b) 同时存在时,(a) 往往可删;可通过 performance_schema 或 pt-duplicate-key-checker 分析










