PostgreSQL 大数据查询与索引优化核心总结

一、实验背景

基于 PostgreSQL 构建日志表,通过千万级数据验证:

  • 全表查询性能

  • 索引(尤其 BRIN)在大数据场景的作用


二、核心结论

1️⃣ GROUP BY 不依赖索引

复制代码
SELECT api, count(*) FROM logs GROUP BY api;

👉 执行计划:

  • Parallel Seq Scan

  • Hash Aggregate

结论:

❗需要扫描全部数据 → 索引无效


2️⃣ WHERE 条件 ≠ 性能提升

复制代码
WHERE ts > now() - interval '1 day'

如果没有索引:

❗仍然是全表扫描 → 性能几乎不变


3️⃣ BRIN 索引的前提

复制代码
CREATE INDEX ... USING BRIN(ts);

必须满足:

❗数据在物理存储上"有序"(如时间递增)


4️⃣ BRIN 的本质

不是精确查找,而是:

❗跳过不相关的数据块(减少 IO)


三、关键实验现象


❌ 无序数据(随机时间)

复制代码
Parallel Seq Scan
Execution Time: ~2500ms

✅ 有序数据 + BRIN

复制代码
Bitmap Index Scan
Execution Time: ~0.09ms

🎯 性能提升

❗约 1000~4000 倍


四、重要反直觉结论


❗索引不是总能加速

当查询命中数据较多(如 >20%):

  • 使用索引(BRIN) → 反而更慢

  • 全表扫描(Seq Scan) → 更快


五、本质理解


PostgreSQL 优化核心:

❗不是"用不用索引"

❗而是"扫描多少数据"


性能公式(核心)

复制代码
查询性能 ≈ 扫描数据量(IO) + 访问方式

六、最终总结


❗MySQL 优化的是:快速定位数据(OLTP)

❗PostgreSQL 优化的是:高效处理数据(OLAP)


❗真正的优化不是"加索引"

❗而是:
减少扫描的数据量


相关推荐
寒山独见君~13 小时前
自动化-消息推送Server酱3,APP推送
运维·数据库·python·自动化·通知
qq_3926906613 小时前
Go语言怎么做DNS查询_Go语言DNS域名解析教程【完整】
jvm·数据库·python
m0_6315298213 小时前
PHP 中 OR 运算符逻辑误用的典型陷阱与正确写法
jvm·数据库·python
步辞13 小时前
如何用 style.setProperty 修改带有优先级的 CSS 变量属性
jvm·数据库·python
Touch_Base13 小时前
护照、身份证与罚单:动力电池出海的隐性门槛
大数据·人工智能·创业创新·esg·可持续
Volunteer Technology13 小时前
ES相关度评分算法
大数据·算法·elasticsearch
xxjj998a13 小时前
Laravel7.x核心特性全解析
数据库·mysql·adb
让我上个超影吧13 小时前
【MYSQL】索引下推
java·数据库·mysql
m0_6315298213 小时前
CSS如何利用Less快速生成颜色渐变背景_使用混合函数生成多样渐变
jvm·数据库·python
重生之我是Java开发战士13 小时前
【MySQL】 索引的底层原理与使用:B+树、数据页与 InnoDB
数据库·b树·mysql