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

