PostgreSQL BRIN 索引應用場景
PostgreSQL BRIN 索引應用場景
核心適用條件(先判斷能不能用)
? 表非常大(千萬行以上,億級最佳)
? 列值與數(shù)據(jù)寫入的物理順序高度相關
? 查詢以"范圍過濾"為主,不需要精確定位單行
? 磁盤空間或寫入性能敏感
場景一:時間序列日志表 ? 最典型
-- 系統(tǒng)訪問日志,按時間順序寫入,數(shù)據(jù)量極大
CREATE TABLE access_log (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT,
url TEXT,
status INT,
created_at TIMESTAMPTZ DEFAULT now()
);
-- ? 用 BRIN,索引只有幾百KB,哪怕表有10億行
CREATE INDEX idx_access_log_brin ON access_log USING BRIN (created_at);
-- 查某天的日志
SELECT * FROM access_log
WHERE created_at BETWEEN '2024-03-01' AND '2024-03-02';
為什么有效:日志按時間順序寫入,物理塊1 = 最早的數(shù)據(jù),物理塊N = 最新數(shù)據(jù),BRIN 能精準跳過無關塊。
場景二:IoT / 傳感器數(shù)據(jù)
CREATE TABLE sensor_data (
sensor_id INT,
temperature FLOAT,
humidity FLOAT,
recorded_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_sensor_brin ON sensor_data USING BRIN (recorded_at);
-- 查某段時間內某傳感器的數(shù)據(jù)
SELECT * FROM sensor_data
WHERE recorded_at > now() - INTERVAL '7 days'
AND sensor_id = 42;
傳感器數(shù)據(jù)天然按時間堆積,BRIN 幾乎是最優(yōu)選擇。
場景三:金融流水 / 訂單表
CREATE TABLE order_flow (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(32),
amount NUMERIC(18,2),
created_at TIMESTAMPTZ DEFAULT now()
);
-- 自增ID 和 created_at 都可以建 BRIN
CREATE INDEX idx_order_id_brin ON order_flow USING BRIN (id);
CREATE INDEX idx_order_time_brin ON order_flow USING BRIN (created_at);
-- 按月查賬單
SELECT sum(amount) FROM order_flow
WHERE created_at BETWEEN '2024-01-01' AND '2024-02-01';
場景四:數(shù)據(jù)倉庫 / 歷史歸檔表
-- 歷史數(shù)據(jù)歸檔表,只追加寫入,幾億行
CREATE TABLE dw_sales_history (
sale_date DATE,
region VARCHAR(50),
product_id BIGINT,
revenue NUMERIC(18,2)
);
-- BRIN 索引極小,配合按 sale_date 查詢非常高效
CREATE INDEX idx_dw_sales_brin ON dw_sales_history USING BRIN (sale_date);
-- 統(tǒng)計某季度數(shù)據(jù)
SELECT region, sum(revenue)
FROM dw_sales_history
WHERE sale_date BETWEEN '2024-01-01' AND '2024-03-31'
GROUP BY region;
場景五:自增主鍵的超大表輔助過濾
-- 超大表上,主鍵 B+Tree 已經(jīng)很大了 -- 如果查詢是大范圍 ID 過濾(比如分片處理) CREATE INDEX idx_events_id_brin ON events USING BRIN (id); -- 批量處理:每次處理一段ID區(qū)間 SELECT * FROM events WHERE id BETWEEN 1000000 AND 2000000;
BRIN 參數(shù)調優(yōu):pages_per_range
-- 默認每128個塊作為一組 -- 數(shù)據(jù)量極大時可以調大,索引更小但精度更低 -- 數(shù)據(jù)量較小時可以調小,精度更高 CREATE INDEX idx_log_brin ON access_log USING BRIN (created_at) WITH (pages_per_range = 64); -- 更精細 -- 或 WITH (pages_per_range = 256); -- 更省空間
? BRIN 不適合的場景(踩坑預防)
-- ? 隨機寫入的字段(沒有物理順序) WHERE email = 'xxx@xxx.com' -- 用 B+Tree -- ? 需要精確查單行 WHERE id = 12345 -- 用 B+Tree -- ? 數(shù)據(jù)會被大量 UPDATE(破壞物理順序) UPDATE users SET score = ... -- 用 B+Tree -- ? 小表(BRIN 優(yōu)勢不明顯,B+Tree 更好) -- 表只有幾十萬行 → 直接用 B+Tree
各場景索引選型速查
| 場景 | 推薦索引 |
|---|---|
| 系統(tǒng)日志、訪問記錄(按時間寫入) | BRIN |
| IoT / 傳感器時序數(shù)據(jù) | BRIN |
| 金融流水、訂單(時間范圍查詢) | BRIN |
| 數(shù)據(jù)倉庫歷史歸檔表 | BRIN |
| 普通業(yè)務表等值查詢 | B+Tree |
| 全文檢索、數(shù)組、JSONB | GIN |
| 模糊查詢 LIKE '%xx%' | GIN + pg_trgm |
一句話總結
BRIN 的黃金場景 = 超大表 + 數(shù)據(jù)按時間/自增順序寫入 + 以時間范圍查詢?yōu)橹鳌?br />滿足這三點,BRIN 能用不到 B+Tree 1% 的索引空間,達到接近甚至更好的查詢性能。
到此這篇關于PostgreSQL BRIN 索引應用場景的文章就介紹到這了,更多相關PostgreSQL BRIN 索引內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
PostgreSQL數(shù)據(jù)庫備份與恢復的四種辦法
在數(shù)據(jù)為王的時代,數(shù)據(jù)庫中存儲的信息堪稱企業(yè)的生命線,而PostgreSQL作為一款廣泛應用的開源數(shù)據(jù)庫,學會如何妥善進行備份與恢復操作,是每個開發(fā)者與運維人員必備的技能,今天,咱們就深入探究一下PostgreSQL相關的備份恢復策略,并附上豐富的代碼示例2025-01-01
PostgreSQL數(shù)據(jù)庫實現(xiàn)公網(wǎng)遠程連接的操作步驟
PostgreSQL是一個功能非常強大的關系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),本文呢將簡單幾步通過cpolar 內網(wǎng)穿透工具即可現(xiàn)實本地postgreSQL 遠程訪問,需要的朋友可以參考下2023-09-09
在PostgreSQL中優(yōu)雅高效地進行全文檢索的完整過程
在現(xiàn)代應用中,用戶期望通過自然語言快速找到所需內容,無論是電商商品搜索、文章檢索還是日志分析,全文檢索已成為核心功能,本文將從 基礎原理、配置優(yōu)化、高級技巧、性能調優(yōu)、實戰(zhàn)案例 五個維度,系統(tǒng)講解如何在 PostgreSQL 中優(yōu)雅高效地實現(xiàn)全文檢索2026-01-01
PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法
這篇文章主要介紹了PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Postgresql導入幾何數(shù)據(jù)(shp,geojson)的幾種方式
本文主要介紹了Postgresql導入幾何數(shù)據(jù)(shp,geojson)的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2026-02-02

