Whoami:5年+金融、政府、医疗领域工作经验的DBACertificate:PGCM、OCP、YCPSkill: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.confshared_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.inipool_mode = transactionmax_client_conn = 1000default_pool_size = 20server_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 ASSELECT 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+ANALYZEpsql -c "VACUUM ANALYZE;"# 定期重建索引reindexdb --all --concurrently
2.监控体系搭建
使用pgMonitor+Prometheus采集关键指标1. 锁等待2. 缓冲区命中率3. 长事务监控
本文内容就到这啦,PostgreSQL性能优化是贯穿设计、开发、运维全周期的系统工程,希望本文的优化方法可以给你带来帮助。我们下篇再见!
文章转载自呆呆的私房菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




