Whoami:5年+金融、政府、医疗领域工作经验的DBA
Certificate:PGCM、OCP、YCP
Skill:Oracle、Mysql、PostgreSQL、国产数据库
Platform:CSDN、墨天轮、公众号(呆呆的私房菜)
复制
1. 范式与反范式的平衡法则
遵循第三范式(3NF)消除冗余,但针对高频查询场景可适度反范式化,例如:
-- 添加冗余字段减少JOIN操作
ALTER TABLE orders ADD COLUMN customer_name VARCHAR(255);
复制
2. 分区表:海量数据的分而治之
- 使用范围/列表分区将TB级表拆解:
CREATE TABLE logs PARTITION BY RANGE (created_at);
CREATE TABLE logs_2024_q1 PARTITION OF logs FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
注:结合pg_partman实现自动分区管理,查询性能提升可达10倍
复制
3. 数据类型优化:节省30%存储空间
用uuid替代varchar(36)节省12字节; 使用timestamptz避免时区转换; jsonb压缩比超json。
1. 执行计划分析
关注执行计划中的指标,如SeqScan代表全表扫描,意味着可能需要添加索引;Nested Loop代表连接方式,关注是否合理。
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM users WHERE email='user@example.com';
复制
2. 索引的黄金法则
组合索引字段顺序遵循最左前缀原则:
CREATE INDEX idx_users_region_age ON users(region, age);
复制
使用覆盖索引消除回表:
CREATE INDEX idx_orders_covering ON orders (user_id) INCLUDE (total_amount);
复制
3. 子查询重构技巧
将in子查询转为join
-- 优化前
SELECT * FROM products WHERE id IN (SELECT product_id FROM orders);
-- 优化后
SELECT p.* FROM products p JOIN orders o ON p.id=o.product_id;
注:性能能提高5-8倍
复制
1.内存参数调整
# postgresql.conf
shared_buffers = 25%内存总量 # 默认128MB→建议8GB+
work_mem = 4MB # 复杂排序/哈希操作时上调
maintenance_work_mem = 1GB # VACUUM等操作专用内存
复制
2.IO优化三板斧
启用SSD+调整random_page_cost=1 设置checkpoint_timeout=30min减少检查点频率 使用pg_prewarm预热热点数据
# pgbouncer.ini
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20
server_idle_timeout = 300
复制
1.并行查询加速
SET max_parallel_workers_per_gather = 4;
SELECT /*+ Parallel(orders 4) */ * FROM orders WHERE amount>1000;
注:结合pg_stat_activity监控并行度
复制
CREATE MATERIALIZED VIEW sales_summary AS
SELECT product_id, SUM(quantity) FROM orders GROUP BY product_id;
REFRESH MATERIALIZED VIEW CONCURRENTLY sales_summary;
注:报表查询速度提升达百倍
复制
CREATE EXTENSION pg_strom;
SELECT gpu_hash_join(t1.col1, t2.col2) FROM t1, t2 WHERE t1.id=t2.id;
注:适合机器学习特征计算场景
复制
1.日常维护
# 定期执行VACUUM+ANALYZE
psql -c "VACUUM ANALYZE;"
# 定期重建索引
reindexdb --all --concurrently
复制
2.监控体系搭建
使用pgMonitor+Prometheus采集关键指标
1. 锁等待
2. 缓冲区命中率
3. 长事务监控
复制
本文内容就到这啦,PostgreSQL性能优化是贯穿设计、开发、运维全周期的系统工程,希望本文的优化方法可以给你带来帮助。我们下篇再见!
文章转载自呆呆的私房菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。