性能优化指南

Guides
最后更新: 2026年2月16日

欢迎阅读 HarborDB 性能优化指南。这份全面的资源将帮助您优化 PostgreSQL 工作流程的各个方面,从编写高效查询到配置 HarborDB 和 macOS 以获得最佳性能。

理解性能因素

多个因素影响您在 HarborDB 中的数据库性能:

| 因素 | 影响度 | 优化级别 | | ---------------------------- | ---------- | ------------------ | | 查询设计 | 高 | 应用程序 | | 数据库索引 | 高 | 数据库 | | 网络连接 | 中等 | 基础设施 | | 系统资源 | 中等 | macOS | | HarborDB 设置 | 低-中等 | 应用程序 | | PostgreSQL 配置 | 高 | 数据库 |

查询优化

编写高效查询

1. 仅选择所需内容

-- ❌ 低效
SELECT * FROM customers;

-- ✅ 高效
SELECT customer_id, name, email FROM customers;

2. 有效使用 WHERE 子句

-- ❌ 低效(全表扫描)
SELECT * FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 2024;

-- ✅ 高效(使用索引)
SELECT * FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date < '2025-01-01';

3. 限制结果集

-- 探索时始终限制
SELECT * FROM large_table LIMIT 100;

-- 对大型结果使用分页
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 50 OFFSET 0;

4. 避免 N+1 查询问题

-- ❌ 低效(多个查询)
-- 第一个查询:SELECT * FROM orders WHERE status = 'pending'
-- 然后对每个订单:SELECT * FROM customers WHERE customer_id = ?

-- ✅ 高效(使用 JOIN 的单个查询)
SELECT o.*, c.name, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.status = 'pending';

使用 EXPLAIN 分析查询

HarborDB 让分析查询性能变得容易:

  1. 在编辑器中编写查询
  2. 点击工具栏中的"解释"按钮(⚡)
  3. 在结果窗格中查看执行计划

理解 EXPLAIN 输出

  • Seq Scan:全表扫描(对于大型表通常较慢)
  • Index Scan:使用索引(通常更快)
  • Nested Loop:连接表(检查是否合适)
  • Cost estimates:数值越高意味着工作量越大

常见优化模式

-- 添加缺失索引建议
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 1234;

-- 结果可能显示:"Seq Scan on orders"
-- 解决方案:CREATE INDEX idx_orders_customer_id ON orders(customer_id);

数据库索引优化

何时添加索引

为以下情况添加索引:

  • 主键(自动索引)
  • 外键(通常需要手动索引)
  • 频繁筛选的列
  • 频繁排序的列
  • 在 JOIN 条件中使用的列

创建有效的索引

-- 单列索引
CREATE INDEX idx_orders_status ON orders(status);

-- 多列索引(顺序很重要!)
CREATE INDEX idx_orders_date_status ON orders(order_date, status);

-- 部分索引(用于特定子集)
CREATE INDEX idx_active_users ON users(email) WHERE active = true;

-- 唯一索引用于约束
CREATE UNIQUE INDEX idx_unique_email ON users(email);

索引维护

-- 检查索引使用情况
SELECT schemaname, tablename, indexname
FROM pg_stat_user_indexes
WHERE idx_scan = 0;  -- 从未使用的索引

-- 重建碎片化索引
REINDEX INDEX idx_orders_status;

-- 为查询规划器更新统计信息
ANALYZE orders;

连接优化

连接池设置

优化您的 HarborDB 连接:

  1. 打开首选项连接
  2. 根据您的工作流程调整设置

| 设置 | 推荐值 | 用途 | | ---------------------- | ----------------- | --------------------------- | | 连接超时 | 30 秒 | 防止连接挂起 | | Keep-Alive | 启用 | 维持空闲连接 | | 最大连接数 | 5-10 | 平衡性能/内存 | | SSL 模式 | Prefer | 安全无额外开销 |

网络优化

对于远程数据库:

  1. 使用 SSH 隧道进行安全、优化的连接
  2. 启用压缩用于大型结果集
  3. 在非高峰时段安排繁重查询
  4. 使用内置工具监控网络延迟
-- 测试网络延迟
SELECT 1 as test;  -- 测量往返时间的简单查询

HarborDB 性能设置

内存管理

首选项性能中调整内存使用:

| 设置 | 建议 | 影响 | | --------------------- | -------------- | ----------------------------- | | 查询缓存 | 256 MB | 重复查询更快 | | 结果集内存 | 512 MB | 处理更大的数据集 | | 流式模式 | 启用 | 对大型结果更好 | | 自动刷新 | 30 秒 | 平衡新鲜度/性能 |

界面优化

  1. 在首选项 → 外观中禁用动画
  2. 将自动完成延迟减少到 100ms
  3. 限制侧边栏自动展开深度
  4. 使用深色模式提高 OLED 显示效率

提高速度的键盘快捷键

掌握这些生产力助推器:

| 快捷键 | 动作 | 节省时间 | | -------- | -------------- | -------------- | | ⌘ + R | 执行查询 | 2-3 秒 | | ⌘ + . | 取消查询 | 防止等待 | | ⌘ + T | 新建查询标签页 | 1-2 秒 | | ⌘ + S | 保存查询 | 1 秒 | | ⌘ + E | 导出结果 | 2 秒 | | ⌘ + F | 在查询中查找 | 3-5 秒 |

macOS 系统优化

硬件考虑

内存(RAM)

  • 最低:基本使用 8 GB
  • 推荐:专业工作 16 GB
  • 最佳:大型数据集 32 GB

存储(SSD)

  • 最低:256 GB 可用空间
  • 推荐:数据库文件和导出需要 512 GB+
  • 使用外部 SSD存储大型数据库

处理器

  • Apple Silicon:M1/M2/M3 优化
  • Intel:最低 i5,推荐 i7/i9

macOS 设置

  1. 节能器(系统偏好设置):

    • 禁用"使硬盘进入睡眠状态"
    • 长时间查询期间保持显示屏开启
  2. 活动监视器

    • 监控 HarborDB 内存使用情况
    • 检查 PostgreSQL 进程资源
  3. 磁盘工具

    • 确保启用 SSD TRIM
    • 监控磁盘健康和可用空间

终端性能命令

# 检查系统资源
top -o cpu  # CPU 使用率
vm_stat     # 内存使用率
iostat      # 磁盘 I/O

# 专门监控 HarborDB
ps aux | grep HarborDB
lsof -p $(pgrep HarborDB) | wc -l  # 打开的文件数

大型数据集策略

处理数百万行数据

1. 服务器端分页

-- 而不是加载所有行
SELECT * FROM huge_table;

-- 使用分页
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 0;

-- 下一页
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 1000;

2. 流式传输结果

首选项性能中启用:

  • ✅ "对结果 > 10,000 行启用流式传输"
  • ✅ "流式传输块大小:1000 行"
  • ✅ "后台流式传输:启用"

3. 物化视图

-- 预先计算昂贵的查询
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT
    DATE(order_date) as day,
    COUNT(*) as orders,
    SUM(total) as revenue
FROM orders
GROUP BY DATE(order_date);

-- 定期刷新
REFRESH MATERIALIZED VIEW daily_sales_summary;

导出优化

对于大型导出:

  1. 导出为 CSV(比 JSON 更高效)
  2. 使用分块导出(首选项 → 导出)
  3. 自动压缩导出
  4. 直接导出到外部存储

监控性能

内置 HarborDB 工具

  1. 查询计时器:在状态栏中显示执行时间
  2. 内存监视器:在窗口 → 性能监视器中查看
  3. 连接状态:实时网络指标
  4. 查询历史:查看过去查询性能

PostgreSQL 监控查询

-- 活动查询
SELECT
    pid,
    usename,
    query_start,
    state,
    query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start DESC;

-- 慢查询
SELECT
    query,
    calls,
    total_time,
    mean_time,
    rows
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

-- 表统计信息
SELECT
    schemaname,
    relname,
    seq_scan,
    idx_scan,
    n_tup_ins,
    n_tup_upd,
    n_tup_del
FROM pg_stat_user_tables
ORDER BY seq_scan DESC;

常见性能问题与解决方案

问题:"查询耗时太长"

解决方案检查清单:

  1. [ ] 添加适当的索引
  2. [ ] 重写查询以提高效率
  3. [ ] 检查 PostgreSQL 配置
  4. [ ] 验证网络连接性
  5. [ ] 如果需要,增加超时设置

问题:"HarborDB 使用过多内存"

解决步骤:

  1. 减少查询缓存大小(首选项 → 性能)
  2. 关闭未使用的查询标签页
  3. 定期重启 HarborDB
  4. 检查内存泄漏(活动监视器)
  5. 如果持续达到限制,增加系统 RAM

问题:"导出/导入非常慢"

优化提示:

  1. 使用 CSV 格式而不是 JSON
  2. 在目标文件夹上禁用防病毒扫描
  3. 导出到 SSD 而不是 HDD
  4. 对于非常大的操作,使用 PostgreSQL 原生工具(pg_dump/pg_restore)
  5. 将大型操作拆分为较小的批次

问题:"界面感觉迟缓"

快速修复:

  1. 对非常大的查询禁用语法高亮
  2. 减少侧边栏自动展开
  3. 使用更简单的 UI 主题
  4. 关闭其他资源密集型应用程序
  5. 重启 HarborDB 和 macOS

高级优化技术

分区大型表

-- 创建分区表
CREATE TABLE orders_partitioned (
    order_id BIGSERIAL,
    order_date DATE NOT NULL,
    customer_id INT,
    total DECIMAL(10,2)
) PARTITION BY RANGE (order_date);

-- 创建分区
CREATE TABLE orders_2024_q1 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

CREATE TABLE orders_2024_q2 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

查询计划提示

-- 强制使用索引(谨慎使用)
SET enable_seqscan = off;

-- 临时增加工作内存
SET work_mem = '64MB';

-- 使用特定的连接方法
SET enable_nestloop = off;
SET enable_hashjoin = on;

使用 PGBouncer 进行连接池

对于高并发应用程序:

  1. 安装 PGBouncer(Homebrew:brew install pgbouncer
  2. 为事务池配置
  3. 通过 PGBouncer 连接 HarborDB
  4. 监控连接重用统计信息

性能测试

创建基准查询

-- 测试查询性能
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
  AND status = 'completed'
ORDER BY total DESC
LIMIT 100;

-- 比较不同方法
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE status = 'completed'
  AND order_date >= '2024-01-01'
  AND order_date <= '2024-12-31'
ORDER BY total DESC
LIMIT 100;

随时间监控

创建性能日志表:

CREATE TABLE query_performance_log (
    log_id SERIAL PRIMARY KEY,
    query_hash TEXT,
    execution_time_ms INTEGER,
    row_count INTEGER,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    notes TEXT
);

-- 记录慢查询
INSERT INTO query_performance_log
    (query_hash, execution_time_ms, row_count, notes)
SELECT
    md5(query),
    EXTRACT(MILLISECONDS FROM NOW() - query_start),
    result_rows,
    '检测到慢查询'
FROM pg_stat_activity
WHERE state = 'active'
  AND NOW() - query_start > INTERVAL '5 seconds';

最佳实践总结

日常工作流程

  1. 从 EXPLAIN 开始处理新的复杂查询
  2. 探索数据时使用 LIMIT
  3. 关闭未使用的连接
  4. 定期重启 HarborDB(每周)
  5. 繁重工作期间监控系统资源

每周维护

  1. 检查查询性能日志
  2. 检查未使用的索引
  3. 更新 PostgreSQL 统计信息(ANALYZE)
  4. 清理临时文件
  5. 备份性能配置

月度审查

  1. 分析慢查询模式
  2. 考虑表分区以适应增长
  3. 审查硬件需求
  4. 更新 HarborDB 和 PostgreSQL
  5. 记录性能改进

获取帮助

性能调优支持

如果您需要额外帮助:

  1. 与我们的支持团队共享查询计划
  2. 导出性能日志(首选项 → 导出日志)
  3. 包含系统规格(macOS 版本、RAM、存储)
  4. 描述您的工作流程和典型数据集大小

其他资源

这对您有帮助吗?

通过提供反馈帮助我们改进此文档。