当前位置: 首页 > news >正文

B-tree索引像字典查词一样工作?那哪些数据库查询它能加速,哪些不能?


url: /posts/f507856ebfddd592448813c510a53669/
title: B-tree索引像字典查词一样工作?那哪些数据库查询它能加速,哪些不能?
date: 2025-10-17T08:06:28+08:00
lastmod: 2025-10-17T08:06:28+08:00
author: cmdragon

summary:
B-tree索引是PostgreSQL默认的索引类型,通过分层结构(根节点、分支节点、叶子节点)快速定位数据,时间复杂度为O(log n)。它支持比较操作符(如=>)、范围查询(如BETWEEN)、空值判断(如IS NULL)以及锚定开头的模式匹配(如LIKE 'foo%')。适用场景包括加速“等于”查询(如用户登录)、范围查询(如订单统计)和空值查询(如查找未激活用户)。不适用于结尾模糊匹配(如LIKE '%phone')、非排序类操作(如!=)和低基数列(如性别)。

categories:

  • postgresql

tags:

  • 基础入门
    • B-tree索引
  • PostgreSQL
  • 数据库优化
  • 索引原理
  • 查询加速
  • 适用场景
  • 常见报错

cmdragon_cn.png

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/

B-tree索引:原理与适用场景

什么是B-tree索引?

B-tree(平衡树)是PostgreSQL默认的索引类型,也是最常用的索引结构。它的设计目标是快速定位符合条件的行,同时保持索引本身的平衡(避免“一边倒”的树形结构导致查询变慢)。你可以把B-tree想象成图书馆的“分类书架目录”:

  • 最顶层是“根目录”(根节点),告诉你要找的书在哪个楼层;
  • 中间层是“楼层索引”(分支节点),告诉你要找的书在哪个书架;
  • 最底层是“书架上的书”(叶子节点),直接指向数据库中具体的行。

这种分层结构让数据库能在**O(log n)**的时间复杂度内找到目标数据(比如从100万行中找1行,只需要约20次查找),远快于全表扫描(O(n))。

B-tree的工作原理(用“字典查词”类比)

假设你有一本英语字典,要查“PostgreSQL”这个词:

  1. 根节点判断:字典的“首字母目录”(根节点)告诉你“P”开头的单词在第150页;
  2. 分支节点定位:翻到第150页,找到“Po”开头的单词在第160页;
  3. 叶子节点查找:翻到第160页,直接找到“PostgreSQL”的具体解释(对应数据库中的行)。

B-tree的逻辑完全一样:

  • 根节点:存储范围边界(比如“P”的起始位置);
  • 分支节点:存储更细的范围(比如“Po”的起始位置);
  • 叶子节点:存储具体的索引值和对应的行指针(比如“PostgreSQL”对应的行ID)。

关键特点:叶子节点是有序且连续的,这让B-tree不仅能快速找“等于”的值,还能快速找“范围”(比如“从P到Q的单词”)。

B-tree支持的操作符(官方明确列出)

根据PostgreSQL 17文档,B-tree索引能加速以下条件的查询:

  1. 比较操作符<(小于)、<=(小于等于)、=(等于)、>=(大于等于)、>(大于);
  2. 组合操作BETWEEN(范围)、IN(多值匹配)、IS NULL/IS NOT NULL(空值判断);
  3. 模式匹配:仅当pattern锚定字符串开头时,支持LIKE~(正则),比如col LIKE 'foo%'(找以foo开头的字符串)、col ~ '^foo'(正则匹配开头);但不支持col LIKE '%bar'(结尾模糊匹配)。
适用场景案例

我们用用户表订单表的例子,说明B-tree的实际用处:

案例1:加速“等于”查询(用户登录)

假设你有一张users表,存储用户的邮箱和密码:

CREATE TABLE users (id SERIAL PRIMARY KEY,email VARCHAR(255) UNIQUE NOT NULL,password_hash TEXT NOT NULL
);

用户登录时,需要根据email查密码:

SELECT password_hash FROM users WHERE email = 'test@example.com';

如果email列没有索引,数据库会扫描全表(比如100万行)找匹配的邮箱;如果创建B-tree索引:

-- PostgreSQL默认创建B-tree索引(无需写USING btree)
CREATE INDEX idx_users_email ON users (email);

查询会直接通过索引定位到email = 'test@example.com'的行,速度提升100倍以上。

案例2:加速“范围”查询(订单统计)

假设你有一张orders表,存储订单的时间和金额:

CREATE<
http://www.dtcms.com/a/495262.html

相关文章:

  • C++实现二叉树搜索树
  • 网站开发和美工的区别手机域名注册被骗
  • 做模特的网站python语言编程入门
  • GeeLark 9月功能更新回顾
  • C++---ref-qualifier( / )函数的左右值调用的界定
  • vue3:数组的.includes方法怎么使用
  • 网站建设及网页设计企业宣传片公司
  • 132.MIG IP核中没有512M16的只有512M8的如何解决
  • SwiftUI 布局之美:Padding 让界面呼吸感拉满
  • RHCSA-08文本处理工具
  • JSP XML 数据处理
  • “String到Date转换失败”:深挖@RequestBody的日期坑
  • 分布式事务以及Seata(XA、AT模式)
  • 做网站的 简历标识设计网
  • 平台网站建设意见征求表社区类网站开发
  • 电脑零配件行业MES系统:快速实现全过程信息溯源
  • 基于单片机与上位机的智能宠物喂食管理系统设计
  • 新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
  • 【深度学习新浪潮】LLM 大模型压缩落地实践(2025 版)
  • 神经网络之计算图repeat节点
  • 河北廊坊做网站珠海企业网站设计
  • 网站建设培训 ppt做网站有哪些
  • 【RK3588开发】RKNN库的使用
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 18--测试框架Pytest基础 2--插件和参数化
  • 玩具 网站模板成立一个网站
  • 阿里网站注册阿里云网站怎么建设
  • 【排查实录】Web 页面能打开,服务器能通接口,客户端却访问失败?原因全在这!
  • 【Linux】系统性能排查:解决卡顿问题
  • 建网站要注意的细节建免费的网站
  • 手机网站建设收费网站建设 合肥