核心作用:通过查看查询执行计划,精准定位性能瓶颈(如全表扫描、索引未使用、连接顺序不合理等)。
操作方法:
EXPLAIN SELECT * FROM users WHERE username = 'alice';EXPLAIN ANALYZE SELECT * FROM users WHERE username = 'alice';索引类型选择:
-- 单列索引(常用查询列)
CREATE INDEX idx_users_username ON users(username);
-- 复合索引(多条件查询)
CREATE INDEX idx_orders_customer_date ON orders(customer_id, order_date);
-- BRIN索引(大表范围查询)
CREATE INDEX idx_large_table_block_range ON large_table USING brin(id);
注意事项:
REINDEX TABLE users;(重建索引)或ANALYZE users;(更新统计信息,帮助优化器选择索引)。**避免SELECT ***:仅查询需要的列,减少数据传输量。
-- 优化前(返回所有列)
SELECT * FROM orders;
-- 优化后(仅返回必要列)
SELECT order_id, customer_id, order_date FROM orders;
优化子查询:将嵌套子查询改写为JOIN操作,减少执行次数。
-- 优化前(子查询可能多次执行)
SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE age > 30);
-- 优化后(JOIN更高效)
SELECT o.* FROM orders o JOIN users u ON o.user_id = u.id WHERE u.age > 30;
WHERE子句优化:
WHERE UPPER(username) = 'ALICE'),会导致索引失效。关键内存参数(需根据服务器内存调整,单位:MB):
work_mem = 64MB)。maintenance_work_mem = 512MB)。max_worker_processes = 8)。适用场景:超大型表(如超过1000万行),通过分区减少查询扫描的数据量。
分区策略:
-- 创建主表
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER,
order_date DATE,
total_amount DECIMAL(10,2)
) PARTITION BY RANGE (order_date);
-- 创建按月分区
CREATE TABLE orders_2025_01 PARTITION OF orders
FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
CREATE TABLE orders_2025_02 PARTITION OF orders
FOR VALUES FROM ('2025-02-01') TO ('2025-03-01');
-- 查询时,PostgreSQL会自动路由到对应分区
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31';
优势:查询时只需扫描相关分区,显著减少I/O开销。
作用:避免频繁创建和销毁数据库连接(连接创建成本高),提高并发性能。
推荐工具:PgBouncer(轻量级连接池,支持Ubuntu)。
安装与配置:
# 安装PgBouncer
sudo apt update
sudo apt install pgbouncer
# 编辑配置文件(/etc/pgbouncer/pgbouncer.ini)
[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 6432
pool_mode = session # 连接池模式(session/transaction/pool)
max_client_conn = 100 # 最大客户端连接数
default_pool_size = 20 # 每个数据库的最大连接数
# 启动PgBouncer
sudo systemctl start pgbouncer
连接方式:应用程序连接PgBouncer的地址(127.0.0.1:6432),而非直接连接PostgreSQL。
pg_stat_statements扩展:监控SQL查询性能,找出最耗时的查询。
启用步骤:
-- 启用扩展
CREATE EXTENSION pg_stat_statements;
-- 查看最耗时的10条查询(按总时间排序)
SELECT query, total_time, calls, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
日志分析:通过postgresql.conf配置日志,记录慢查询。
# 记录执行时间超过1秒的查询
log_min_duration_statement = 1000
# 记录所有SQL语句(调试用)
log_statement = 'all'
工具推荐:使用pgAdmin的内置监控工具(如“查询工具”“性能监控”)可视化分析性能。
使用SSD存储:PostgreSQL对I/O敏感,SSD的高读写速度可显著提升查询性能(尤其是随机读写场景)。
更新软件包:保持PostgreSQL和Ubuntu系统为最新版本,新版本通常包含性能优化和bug修复。
sudo apt update
sudo apt upgrade postgresql postgresql-contrib
调整系统参数:优化Ubuntu的I/O调度器(如改为deadline)、增加文件描述符限制(ulimit -n 65535),提升系统吞吐量。