带你大致看看数据库里那些索引到底都有哪些类型和区别
- 问答
- 2026-01-07 12:01:13
- 4
当我们谈论数据库索引时,可以把它想象成一本厚厚的书前面的“目录”,没有目录,你想找某个章节的内容,只能一页一页地翻,非常慢,而有了目录,你就能快速定位到内容所在的页码,数据库索引就是数据的“目录”,它能极大地加快数据查询的速度。
这个“目录”有很多种做法,适用于不同的场景,下面我们就来大致看看这些主要的索引类型和它们的区别。
从数据结构的角度看
这是最核心的一种分类方式,不同的数据结构决定了索引的能力和局限。

-
B-Tree 索引(平衡树索引)
- 这是最最常见、最默认的索引类型,MySQL 的 InnoDB 引擎、PostgreSQL 等数据库的默认索引就是它。
- 长什么样:你可以想象成一棵倒过来的、枝繁叶茂的树,从树根开始,每一层都有很多分支,数据有序地存储在树的叶子节点上,这种结构保证了从根节点到任何一个叶子节点所经过的路径长度都是一样的,所以查询速度很稳定。
- 擅长什么:
- 等值查询:快速找到等于某个值的数据,
WHERE id = 123。 - 范围查询:快速找到某个范围内的数据,
WHERE age BETWEEN 20 AND 30,或者WHERE name > ‘张三’,因为数据在叶子节点上是排好序的,所以找起来很快。
- 等值查询:快速找到等于某个值的数据,
- 不擅长什么:如果查询条件不是从索引的最左边列开始,索引可能就用不上了,比如索引是 (姓, 名),但你只用
WHERE 名 = ‘三’来查,索引就失效了。
-
哈希索引
- 工作原理:它不像 B-Tree 那样比较大小,而是像一个快速的“映射表”,它会对索引列的值计算一个哈希码(可以理解成一个唯一的、固定长度的数字指纹),然后直接把这个哈希码映射到数据所在的位置。
- 擅长什么:
- 非常非常快的等值查询:理论上一次计算就能定位到数据,速度极快。
WHERE id = 123,这种场景下通常比 B-Tree 还快。
- 非常非常快的等值查询:理论上一次计算就能定位到数据,速度极快。
- 不擅长什么(局限性很大):
- 完全不能做范围查询:因为哈希码是散列的,没有顺序可言,
WHERE id > 100这样的查询它无能为力。 - 不支持部分匹配:必须提供完整的索引键值才能计算哈希码。
- 哈希冲突:不同的值可能计算出相同的哈希码,需要额外处理。
- 完全不能做范围查询:因为哈希码是散列的,没有顺序可言,
- 备注:MySQL 的 Memory 引擎显式支持哈希索引,而 InnoDB 引擎有一个“自适应哈希索引”功能,是内部自动创建的,当它发现某些索引值被频繁用等值查询时,会在 B-Tree 索引之上再建立一个哈希索引来加速。
-
位图索引

- 工作原理:为索引列的每个可能的值创建一个位图(一串 0 和 1),性别”列,有“男”和“女”两个值,那么就会有两个位图,对于“男”的位图,如果第一条记录是男,位图第一位就是1,否则是0;第二条记录是男,第二位就是1,以此类推。
- 擅长什么:
- 字段值种类很少的列(低基数性),比如性别、状态、省份等。
- 多个条件的 AND/OR 查询:效率极高,比如要查“性别=女 AND 省份=北京”,只需要将“女”的位图和“北京”的位图进行“按位与”操作,结果中为1的位置就是满足条件的记录行。
- 不擅长什么:
- 频繁更新的列:因为更新一条记录可能需要锁定多个位图,在高并发写入的场景下性能很差。
- 备注:这在数据仓库(OLAP)中很常见,Oracle 和 PostgreSQL 都支持,但在需要频繁增删改的在线交易系统(OLTP)中很少用。
-
全文索引
- 专门用来解决“文本内容搜索”的问题,B-Tree 索引做不到“模糊匹配”,比如你想在文章内容里找所有包含“数据库”这个词的记录,用
LIKE ‘%数据库%’会非常慢,因为需要全表扫描。 - 工作原理:它会对文本内容进行分词,建立单词(关键词)到文档的倒排索引,简单说,就是先提取出文章里所有的词,然后记录每个词出现在哪些文章里。
- 擅长什么:自然语言的全文搜索,支持复杂的搜索语法,比如匹配相关性、布尔搜索(AND, OR, NOT)等。
- 备注:Elasticsearch 这类搜索引擎就是全文索引的专家,MySQL、PostgreSQL 也内置了全文索引功能。
- 专门用来解决“文本内容搜索”的问题,B-Tree 索引做不到“模糊匹配”,比如你想在文章内容里找所有包含“数据库”这个词的记录,用
从物理存储的角度看
-
聚簇索引

- 特点:索引的顺序就是数据在硬盘上存储的物理顺序,一张表只能有一个聚簇索引,因为数据本身只能按一种方式排序。
- 例子:InnoDB 表的主键(Primary Key)就是聚簇索引,如果你没定义主键,InnoDB 会找一个唯一的非空索引代替,如果还没有,它会自己生成一个隐藏的行ID作为聚簇索引。
- 优点:因为数据行就存放在索引的叶子节点上,所以通过聚簇索引查找数据非常快,一次索引查找就能拿到完整的数据行。
- 缺点:插入速度严重依赖于插入顺序,如果不是按主键顺序插入,可能会导致页分裂,影响性能。
-
非聚簇索引(也叫二级索引)
- 特点:索引的顺序与数据物理排列顺序无关,它的叶子节点存储的不是完整的数据行,而是指向数据行的“指针”(在 InnoDB 中,这个指针就是主键值)。
- 例子:你为主键以外的列创建的索引,比如在
name字段上建的索引,都是非聚簇索引。 - 工作方式:当你通过
name索引查找时,先找到对应的主键值,然后再用这个主键值去聚簇索引里再查一次,才能拿到完整数据,这个过程叫做“回表”。 - 优点:一张表可以创建多个非聚簇索引。
- 缺点:如果查询需要回表,性能会比聚簇索引差一些。
其他特殊类型
-
覆盖索引
- 这其实不是一种单独的索引类型,而是一种高级用法,如果一个索引包含了查询所需要的所有字段,那么数据库引擎就不需要回表了,可以直接从索引中取得数据,效率极高。
- 例子:表有 id(主键),name, age,你有一个索引是 (name, age),如果你的查询是
SELECT age FROM table WHERE name = ‘张三’,那么只需要扫描这个索引就能得到结果,因为age已经在索引里了。
-
复合索引(联合索引)
- 指的是由多个列共同组成的索引。
INDEX (last_name, first_name)。 - 特点:它遵循“最左前缀原则”,查询条件必须包含联合索引的最左边的列,索引才会被充分利用,上面的索引对
WHERE last_name = ‘张’有效,对WHERE first_name = ‘三’效果就不好。
- 指的是由多个列共同组成的索引。
总结一下区别:
- B-Tree vs 哈希:B-Tree 是全能选手,范围查询是强项;哈希是特长生,只精通等值查询,但速度可能更快。
- 聚簇 vs 非聚簇:聚簇索引是“内容本身所在的目录”,非聚簇索引是“另一个指向内容页码的目录”。
- 位图索引 适合值种类少的静态数据,全文索引 专攻大文本搜索。
- 复合索引和覆盖索引 是设计和优化索引时的关键技巧。
选择哪种索引,完全取决于你的数据特性和查询需求,没有万能的索引,只有最适合的索引。 综合参考了关系型数据库(如 MySQL、Oracle、PostgreSQL)的通用知识,以及技术社区如 Stack Overflow、数据库官方文档中的常见概念解释。)
本文由凤伟才于2026-01-07发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/76178.html
