PostgreSQL 索引类型详解

1. 索引创建基础语法

PostgreSQL 默认使用B-tree索引,通过CREATE INDEX命令创建;其他索引类型需通过USING关键字显式指定,通用语法如下:

-- 默认创建 B-tree 索引 CREATE INDEX 索引名 ON 表名 (列名); -- 创建指定类型的索引 CREATE INDEX 索引名 ON 表名 USING 索引类型 (列名); -- 示例:创建 Hash 索引 CREATE INDEX idx_user_id ON users USING HASH (user_id);

2. 核心索引类型及实操样例

2.1 B-tree 索引

2.1.1 核心特性

B-tree(平衡树)是 PostgreSQL 默认索引类型,适用于可排序数据的等值、范围查询,支持排序操作,是最通用的索引类型。

2.1.2 支持的操作符
  • 基础比较:<(小于)、<=(小于等于)、=(等于)、>=(大于等于)、>(大于)
  • 组合条件:BETWEEN(介于两值之间)、IN(匹配列表中任一值)
  • 空值判断:IS NULL(为空)、IS NOT NULL(不为空)
  • 模式匹配(有限支持):
  • LIKE 'foo%'(模糊匹配以foo开头的字符串)、~ '^foo'(正则匹配以foo开头的字符串)
  • ILIKE(不区分大小写的模糊匹配)、~*(不区分大小写的正则匹配),仅模式以非字母开头时生效
2.1.3 实操样例

步骤1:创建测试表

-- 创建用户表 CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL, age INT, register_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 插入测试数据 INSERT INTO users (username, age) VALUES ('zhangsan', 25), ('lisi', 30), ('wangwu', 28), ('zhaoliu', 35);

步骤2:创建 B-tree 索引

-- 为 age 列创建 B-tree 索引(默认类型,可省略 USING BTREE) CREATE INDEX idx_users_age ON users (age); -- 为 register_time 列创建 B-tree 索引(支持范围/排序) CREATE INDEX idx_users_register_time ON users (register_time);

步骤3:索引生效的查询场景

-- 等值查询(命中 idx_users_age) SELECT * FROM users WHERE age = 30; -- 范围查询(命中 idx_users_age) SELECT * FROM users WHERE age BETWEEN 25 AND 30; -- 排序查询(命中 idx_users_register_time) SELECT * FROM users ORDER BY register_time DESC LIMIT 2; -- 模式匹配(前缀匹配,命中 idx_users_username) CREATE INDEX idx_users_username ON users (username); SELECT * FROM users WHERE username LIKE 'zhang%';

2.2 Hash 索引

2.2.1 核心特性

存储索引列的 32 位哈希值,仅支持简单等值比较,功能单一但等值查询效率高,适用场景有限。

2.2.2 支持的操作符

仅等值判断:=

2.2.3 实操样例

步骤1:创建 Hash 索引

-- 为 username 列创建 Hash 索引(仅支持等值) CREATE INDEX idx_users_username_hash ON users USING HASH (username);

步骤2:索引生效的查询场景

-- 纯等值查询(命中 Hash 索引) SELECT * FROM users WHERE username = 'lisi'; -- 注意:以下场景 Hash 索引不生效,会走全表扫描 SELECT * FROM users WHERE username LIKE 'li%'; -- 范围/模糊查询不支持 SELECT * FROM users WHERE age = 28; -- 未创建 Hash 索引的列

2.3 GiST 索引

2.3.1 核心特性

GiST(Generalized Search Tree)并非单一索引,而是通用索引框架,可实现多种索引策略,支持复杂数据类型(如空间几何、全文检索)和“最近邻”搜索。

2.3.2 支持的操作符(以二维几何类型为例)

空间关系:<<(左侧)、&<(重叠左侧)、&>(重叠右侧)、>>(右侧)、<<|(下侧)、&<|(重叠下侧)、|&>(重叠上侧)、|>>(上侧)、@>(包含)、<@(被包含)、~=(相等)、&&(相交);最近邻搜索:<->(距离运算符,用于按距离排序)

2.3.3 实操样例(空间数据场景)

步骤1:启用 PostGIS 扩展(需先安装)

CREATE EXTENSION IF NOT EXISTS postgis;

步骤2:创建空间数据表并插入数据

-- 创建地点表(包含地理坐标) CREATE TABLE places ( id SERIAL PRIMARY KEY, name VARCHAR(100), location GEOGRAPHY(POINT) -- 地理坐标类型 ); -- 插入测试地点(纬度、经度) INSERT INTO places (name, location) VALUES ('公园', ST_SetSRID(ST_MakePoint(116.40, 39.90), 4326)), ('商场', ST_SetSRID(ST_MakePoint(116.41, 39.91), 4326)), ('学校', ST_SetSRID(ST_MakePoint(116.39, 39.89), 4326));

步骤3:创建 GiST 索引

-- 为地理坐标列创建 GiST 索引 CREATE INDEX idx_places_location ON places USING GIST (location);

步骤4:索引生效的查询场景

-- 1. 空间包含查询(查找指定区域内的地点) SELECT * FROM places WHERE ST_DWithin(location, ST_SetSRID(ST_MakePoint(116.40, 39.90), 4326), 1000); -- 1000 米范围内 -- 2. 最近邻搜索(查找离指定坐标最近的 2 个地点) SELECT * FROM places ORDER BY location <-> ST_SetSRID(ST_MakePoint(116.40, 39.90), 4326) LIMIT 2;

2.4 SP-GiST 索引

2.4.1 核心特性

SP-GiST(Space-Partitioned Generalized Search Tree)是另一种通用索引框架,支持非平衡磁盘数据结构(四叉树、k-d 树、基数树等),适配空间分区类查询,轻量化高效。

2.4.2 支持的操作符(以二维点类型为例)

空间关系:<<(左侧)、>>(右侧)、~=(相等)、<@(被包含)、<<|(下侧)、|>>(上侧);最近邻搜索:支持(依赖具体操作符类,常用<->距离运算符)

2.4.3 实操样例(二维点数据)

步骤1:创建二维点表并插入数据

-- 创建二维点表 CREATE TABLE points ( id SERIAL PRIMARY KEY, pos POINT -- 二维点类型 ); -- 插入测试数据 INSERT INTO points (pos) VALUES ('(1,2)'), ('(3,4)'), ('(5,6)'), ('(7,8)');

步骤2:创建 SP-GiST 索引

-- 为 pos 列创建 SP-GiST 索引 CREATE INDEX idx_points_pos ON points USING SP-GiST (pos);

步骤3:索引生效的查询场景

-- 1. 空间范围查询(查找 x 轴小于 5 的点) SELECT * FROM points WHERE pos << '(5,5)'; -- << 表示左侧(x 更小) -- 2. 最近邻搜索(查找离 (4,4) 最近的点) SELECT * FROM points ORDER BY pos <-> '(4,4)' LIMIT 1;

2.5 GIN 索引

2.5.1 核心特性

GIN(Generalized Inverted Index,倒排索引)专为多值数据类型设计,为每个组成值建立独立索引项,高效支持“包含/存在”类查询,是数组、JSONB、全文检索的首选索引。

2.5.2 支持的操作符(以数组类型为例)

包含/存在:<@(被包含,如数组A <@ 数组B表示A是B的子集)、@>(包含,如数组A @> 数组B表示B是A的子集)、=(相等)、&&(相交,两数组有共同元素)

2.5.3 实操样例(数组/JSONB 场景)

场景1:数组查询

-- 1. 创建带数组列的表 CREATE TABLE articles ( id SERIAL PRIMARY KEY, title VARCHAR(100), tags TEXT[] -- 标签数组 ); -- 2. 插入测试数据 INSERT INTO articles (title, tags) VALUES ('PostgreSQL 索引', ARRAY['postgres', '数据库', '索引']), ('Python 教程', ARRAY['python', '编程', '教程']), ('GIS 空间分析', ARRAY['gis', 'postgres', '空间数据']); -- 3. 创建 GIN 索引 CREATE INDEX idx_articles_tags ON articles USING GIN (tags); -- 4. 索引生效的查询(包含指定标签) SELECT * FROM articles WHERE tags @> ARRAY['postgres']; -- 包含 postgres 标签 SELECT * FROM articles WHERE tags && ARRAY['数据库', '编程']; -- 交集(包含任一)

场景2:JSONB 查询

-- 1. 创建带 JSONB 列的表 CREATE TABLE products ( id SERIAL PRIMARY KEY, info JSONB -- 产品信息(JSONB 类型) ); -- 2. 插入测试数据 INSERT INTO products (info) VALUES ('{"name": "手机", "price": 2999, "tags": ["数码", "通讯"]}'), ('{"name": "电脑", "price": 5999, "tags": ["数码", "办公"]}'); -- 3. 创建 GIN 索引 CREATE INDEX idx_products_info ON products USING GIN (info); -- 4. 索引生效的查询(JSONB 包含键/值) SELECT * FROM products WHERE info @> '{"tags": ["数码"]}'; -- 包含数码标签 SELECT * FROM products WHERE info ->> 'name' = '手机'; -- 等值查询(需结合操作符)

2.6 BRIN 索引

2.6.1 核心特性

BRIN(Block Range Index,块范围索引)存储表物理块范围的值摘要信息(最小值/最大值),占用空间极小,适配大数据量且物理顺序与逻辑顺序高度相关的场景(如时序日志表)。

2.6.2 支持的操作符(线性排序类型)

基础比较:<(小于)、<=(小于等于)、=(等于)、>=(大于等于)、>(大于)

2.6.3 实操样例(时序日志表)

步骤1:创建日志表并插入有序数据

-- 创建访问日志表(按时间有序插入) CREATE TABLE access_logs ( id SERIAL, user_id INT, access_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ip VARCHAR(20) ); -- 插入 10 万条测试数据(模拟时间有序的日志) INSERT INTO access_logs (user_id, ip) SELECT floor(random() * 1000)::INT, '192.168.' || floor(random() * 255)::INT || '.' || floor(random() * 255)::INT FROM generate_series(1, 100000);

步骤2:创建 BRIN 索引

-- 为 access_time 列创建 BRIN 索引(物理有序,效率高) CREATE INDEX idx_access_logs_time ON access_logs USING BRIN (access_time);

步骤3:索引生效的查询场景

-- 范围查询(命中 BRIN 索引,快速定位块范围) SELECT COUNT(*) FROM access_logs WHERE access_time BETWEEN '2026-01-01 00:00:00' AND '2026-01-01 12:00:00'; -- 注意:若数据物理无序,BRIN 索引会失效,优先选 B-tree

2.7 扩展索引:Bloom

2.7.1 核心特性

Bloom 是 PostgreSQL 扩展提供的索引类型,基于布隆过滤器实现,适用于多列等值查询,可大幅减少多列组合索引的存储空间,但存在假阳性(需回表验证)。

2.7.2 实操样例

步骤1:启用 bloom 扩展

CREATE EXTENSION IF NOT EXISTS bloom;

步骤2:创建 Bloom 索引

-- 为 user_id 和 ip 多列创建 Bloom 索引 CREATE INDEX idx_access_logs_bloom ON access_logs USING bloom (user_id, ip) WITH (length=80, col1=2, col2=4); -- length:索引长度;colN:各列的位数

步骤3:索引生效的查询场景

-- 多列等值查询(命中 Bloom 索引) SELECT * FROM access_logs WHERE user_id = 100 AND ip = '192.168.10.20';

2.7.3 Bloom 索引 vs 传统多列组合索引(B-tree)

在多列等值查询场景中,Bloom 索引和 B-tree 组合索引是两种常见方案,但设计理念、性能、适用场景差异显著,以下是详细对比:

1. 核心原理差异
维度Bloom 索引B-tree 组合索引
存储结构基于布隆过滤器,存储列的哈希值位图,不存储原始数据基于平衡树,按列的组合顺序存储原始值(如 (col1, col2))
存储空间极小(MB 级),仅存储哈希位图,与表行数无关较大(GB 级),需存储所有列的原始值,随行数线性增长
索引精度存在假阳性(可能匹配到不存在的数据,需回表验证)精准匹配,无假阳性
2. 支持的查询场景
查询类型Bloom 索引B-tree 组合索引
多列全等值查询支持(如col1 = ? AND col2 = ?支持(且精准)
前缀列查询不支持(如仅查col1 = ?无法使用)支持(组合索引的核心优势,如 (col1, col2) 支持仅查 col1)
范围查询不支持(仅等值)支持(如col1 = ? AND col2 > ?
排序/分组不支持支持(按组合列排序)
3. 实操对比样例

access_logs前提:复用前文 表(10 万条数据)

-- 场景1:创建 B-tree 组合索引(col1=user_id, col2=ip) CREATE INDEX idx_access_logs_btree ON access_logs (user_id, ip); -- 场景2:创建 Bloom 索引 CREATE INDEX idx_access_logs_bloom ON access_logs USING bloom (user_id, ip) WITH (length=80, col1=2, col2=4); -- 对比1:多列全等值查询 -- Bloom 索引生效(需回表验证假阳性) EXPLAIN ANALYZE SELECT * FROM access_logs WHERE user_id = 100 AND ip = '192.168.10.20'; -- B-tree 组合索引生效(精准匹配,无需回表) EXPLAIN ANALYZE SELECT * FROM access_logs WHERE user_id = 100 AND ip = '192.168.10.20'; -- 对比2:仅前缀列查询(Bloom 失效,B-tree 生效) -- Bloom 索引不生效(仅查 user_id),走全表扫描 EXPLAIN ANALYZE SELECT * FROM access_logs WHERE user_id = 100; -- B-tree 组合索引生效(前缀列匹配) EXPLAIN ANALYZE SELECT * FROM access_logs WHERE user_id = 100; -- 对比3:范围查询(Bloom 失效,B-tree 生效) -- Bloom 索引不生效(ip 用范围) EXPLAIN ANALYZE SELECT * FROM access_logs WHERE user_id = 100 AND ip LIKE '192.168.10.%'; -- B-tree 组合索引生效(前缀列等值 + 后缀列范围) EXPLAIN ANALYZE SELECT * FROM access_logs WHERE user_id = 100 AND ip LIKE '192.168.10.%';

4. 适用场景选择
选 Bloom 索引选 B-tree 组合索引
多列全等值查询为主需要支持前缀列查询、范围查询、排序
表数据量极大(千万/亿级),追求极小存储成本数据量中等,追求查询精准度和多功能性
可接受少量假阳性(回表验证的性能损耗)对查询精度要求高,不接受假阳性
多列无明显“前缀优先级”(无单列表查询)有明确的前缀列查询需求(如仅查 user_id)

3. 索引类型选择速查表

索引类型核心优势典型适用场景核心样例语句备注
B-tree通用、支持排序/范围常规等值/范围查询CREATE INDEX idx ON tbl (col);默认选择,覆盖 80%+ 场景
Hash等值查询效率高纯等值查询CREATE INDEX idx ON tbl USING HASH (col);功能单一,适用场景有限
GiST复杂数据、最近邻空间数据、全文检索CREATE INDEX idx ON tbl USING GIST (geo_col);需配合扩展(如 PostGIS)
SP-GiST空间分区、轻量化二维点/多维数据CREATE INDEX idx ON tbl USING SP-GiST (pos_col);非平衡结构,适配分区查询
GIN多值数据、倒排索引数组、JSONB、全文检索CREATE INDEX idx ON tbl USING GIN (array_col);多值数据首选索引
BRIN低存储、大数据量有序表日志表、时序数据CREATE INDEX idx ON tbl USING BRIN (time_col);仅适用于数据物理有序场景
Bloom多列等值、低存储多列组合等值查询(无前缀/范围需求)CREATE INDEX idx ON tbl USING bloom (col1, col2);对比 B-tree 组合索引:存储小但功能单一,有假阳性

4. 总结

  1. 优先选 B-tree:无特殊需求时,B-tree 可覆盖 80% 以上的常规查询场景,是默认且最通用的选择。
  2. 专用场景选专用索引:处理空间数据用 GiST/SP-GiST,多值数据(数组/JSONB)用 GIN,大数据量有序表用 BRIN。
  3. 多列查询选对索引:需支持前缀列、范围查询 → 选 B-tree 组合索引;仅多列全等值查询、追求低存储 → 选 Bloom 索引(接受假阳性)。
  4. 样例可直接复用:文档中所有 SQL 样例均基于 PostgreSQL 14+ 编写,启用扩展(如 postgis、bloom)后可直接执行,便于快速验证索引效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1118586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker与Git协同开发终极指南】:掌握工作树创建的5大核心技巧

第一章&#xff1a;Docker与Git协同开发的核心价值在现代软件开发中&#xff0c;环境一致性与版本控制是保障团队协作效率的关键。Docker 与 Git 的结合为开发者提供了一套完整的解决方案&#xff1a;Git 负责源码的版本管理与协作流程&#xff0c;而 Docker 确保应用在任意环境…

SpringBoot 原理专题

优先级与打包命令行参数系统环境propertiesymlyaml打包插件<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configurat…

2026年口碑不错的AI智能办公鼠标品牌企业推荐,专业的AI智能办公鼠标全解析 - myqiye

在AI技术深度融入工作场景的当下,一款高效的AI智能办公鼠标已成为企业降本增效、个人提升生产力的必备工具。面对市场上琳琅满目的产品,如何挑选口碑好、专业度高的品牌?以下根据不同技术方向,为你推荐2025年五大靠…

2026年AI智能办公鼠标推荐:信誉好的AI智能办公鼠标源头工厂有哪些? - mypinpai

本榜单依托市场调研与真实用户反馈,筛选出五家AI智能办公鼠标领域的优质企业,为企业及个人选型提供客观参考,助力精准匹配适配的AI办公工具伙伴。 TOP1 推荐:深圳市南方网通网络技术开发有限公司 推荐指数:★★★…

零基础入门三极管工作状态:从偏置电压讲起

从零开始搞懂三极管&#xff1a;偏置电压如何决定它是放大器还是开关&#xff1f;你有没有遇到过这样的情况——电路里明明接了三极管&#xff0c;但LED就是不亮&#xff1f;或者音频信号一放大就失真&#xff0c;声音像被“掐住脖子”&#xff1f;这些问题的背后&#xff0c;很…

运动训练方案设计:循序渐进达成体能提升目标

VibeThinker-1.5B&#xff1a;小模型如何实现高强度逻辑推理 在大模型军备竞赛愈演愈烈的今天&#xff0c;动辄千亿参数、数千万美元训练成本的AI系统已屡见不鲜。然而&#xff0c;在实验室之外的真实场景中&#xff0c;更多人面临的却是算力受限、部署困难、响应延迟等现实问…

上交大 × 华为小艺推出LoPA:7B扩散语言模型单样例1000+ tokens/s!

单样例推理速度对比&#xff1a;SGLang 部署的 Qwen3-8B (NVIDIA) vs. LoPA-Dist 部署 (NVIDIA & Ascend)&#xff08;注&#xff1a;NVIDIA平台相同&#xff0c;配置对齐&#xff09;在大语言模型&#xff08;LLMs&#xff09;领域&#xff0c;扩散大语言模型&#xff08;…

定制铂金坩埚生产厂家哪家好?2025年度榜单 - 品牌推荐大师

2021至2025年间,中国铂金坩埚产能年均复合增长率约为6.8%,2025年产量已突破12万件,市场规模达到约28亿元人民币。预计2026至2030年间将以年均复合增长率约9.5%的速度稳步扩张,到2030年市场规模有望突破43亿元;也有…

无人机自主导航试验:搭载VibeThinker实现避障决策

无人机自主导航试验&#xff1a;搭载VibeThinker实现避障决策 在消费级无人机穿越密集树林的飞行测试中&#xff0c;一个关键问题始终困扰着开发者&#xff1a;如何让飞行器在没有预设地图、算力有限的情况下&#xff0c;实时“想出”一条既能绕开突发障碍又能高效抵达目标的路…

Java 后端框架的龙头之选—Spring Boot

Java 后端框架的龙头之选—Spring Boot 在技术语言革新极快的今天,尤其对于需要技术沉淀的后端工程师来说,靠什么实力逆风翻盘?在 Java 框架尚且繁荣的当下,Spring Boot 无疑是最火最实用的,也是必不可少的开源框…

公益组织合作项目:为视障人士开发语音交互推理助手

公益组织合作项目&#xff1a;为视障人士开发语音交互推理助手 在一场面向特殊教育学校的调研中&#xff0c;一位视障高中生向我们提出了一个简单却令人深思的问题&#xff1a;“老师讲的几何证明我记不住步骤&#xff0c;能不能有个‘会思考’的声音&#xff0c;像同桌一样一步…

法律条文解释助手:梳理复杂法规之间的引用网络

法律条文解释助手&#xff1a;梳理复杂法规之间的引用网络 在法律实务中&#xff0c;一个看似简单的条款适用问题&#xff0c;往往牵扯出一张错综复杂的引用网络。比如&#xff0c;“初次违法能否免罚”这一问题&#xff0c;可能同时涉及《行政处罚法》第33条、“两高”司法解释…

CWDM光模块 是啥

CWDM光模块 是啥CWDM 光模块 是一种用于光纤通信的 粗波分复用(Coarse Wavelength Division Multiplexing)光模块,在通信、数据中心、工业网络里都很常见。 我给你用工程师能听懂的方式讲👇一句话先懂CWDM 光模块…

Spring-boot读书笔记一enableByDefault

enableByDefault is a parameter in the @Endpoint annotation that controls whether the custom actuator endpoint is automatically enabled or requires explicit configuration. enableByDefault Details: Synta…

2026年东莞304不锈钢卷推荐厂商排行榜,精选304不锈钢卷优质厂家推荐 - myqiye

为帮下游企业高效锁定适配自身需求的304不锈钢卷供应合作伙伴,避免采购走弯路,我们从材质合规性(如食品级认证、成分达标率)、加工精度(分条/平板误差控制)、交付效率(常规/定制订单周期)、服务响应速度(选型…

电磁辐射安全监测:基站布局合理性分析模型

电磁辐射安全监测&#xff1a;基站布局合理性分析模型 在城市化进程不断加快的今天&#xff0c;5G基站如雨后春笋般遍布居民区、商业中心和交通枢纽。然而&#xff0c;公众对“头顶上的信号塔是否安全”的疑虑也日益增长——电磁辐射究竟会不会超标&#xff1f;新建基站会不会影…

NFT价值评估模型:基于稀缺性与社区活跃度推理

NFT价值评估模型&#xff1a;基于稀缺性与社区活跃度推理 在NFT市场狂飙突进的这几年&#xff0c;我们见证过天价拍卖的辉煌&#xff0c;也亲历了无数项目归零的沉寂。一张像素头像卖到数百万美元&#xff0c;而更多精心设计的作品却无人问津——这种极端分化背后&#xff0c;暴…

股市波动归因分析:寻找隐藏在数据背后的根本动因

股市波动归因分析&#xff1a;寻找隐藏在数据背后的根本动因 在金融市场的喧嚣中&#xff0c;一次突如其来的股市暴跌总能引发无数猜测——是美联储的一句鹰派言论&#xff1f;某科技巨头财报暴雷&#xff1f;还是地缘冲突突然升级&#xff1f;分析师们争先恐后地给出解释&…

Docker Falco 规则进阶实战(从入门到高阶定制)

第一章&#xff1a;Docker Falco 规则自定义概述 Falco 是一个开源的云原生运行时安全工具&#xff0c;能够实时检测异常行为和潜在威胁。在 Docker 环境中&#xff0c;Falco 通过内核级事件捕获机制监控容器活动&#xff0c;并依据预定义规则触发告警。然而&#xff0c;标准规…

2026年度靠谱的AI智能办公鼠标品牌企业推荐:不错的AI智能办公鼠标品牌企业有哪些? - 工业品牌热点

本榜单依托市场实测数据、用户真实反馈与技术实力评估,筛选出五家标杆企业,为个人与企业选型提供客观参考,助力匹配适配的AI办公生产力工具。 TOP1 推荐:深圳市南方网通网络技术开发有限公司 推荐指数:★★★★★…