perf: IoT 卡 30M 行分页查询优化(P95 17.9s → <500ms)
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m6s

- 新增 is_standalone 物化列 + 触发器自动维护(迁移 056)
- 并行查询拆分:多店铺 IN 查询拆为 per-shop goroutine 并行 Index Scan
- 两阶段延迟 Join:深度分页(page≥50)走覆盖索引 Index Only Scan 取 ID 再回表
- COUNT 缓存:per-shop 并行 COUNT + Redis 30 分钟 TTL
- 索引优化:删除有害全局索引、新增 partial composite indexes(迁移 057/058)
- ICCID 模糊搜索路径隔离:trigram GIN 索引走独立查询路径
- 慢查询阈值从 100ms 调整为 500ms
- 新增 30M 测试数据种子脚本和 benchmark 工具
This commit is contained in:
2026-02-24 16:23:02 +08:00
parent c665f32976
commit f32d32cd36
20 changed files with 2705 additions and 50 deletions

View File

@@ -0,0 +1,85 @@
#!/bin/bash
set -e
DATA_DIR="/mnt/data1/database/pgsql/pgdata_perf"
CONTAINER="postgres-perf-test"
echo "=========================================="
echo " 性能测试 PostgreSQL 容器部署"
echo "=========================================="
if [ -d "$DATA_DIR" ] && [ "$(ls -A $DATA_DIR 2>/dev/null)" ]; then
echo "⚠️ 数据目录已存在"
read -p "清空重建?(y/N): " confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
docker stop $CONTAINER 2>/dev/null || true
docker rm $CONTAINER 2>/dev/null || true
sudo rm -rf "$DATA_DIR"
fi
fi
sudo mkdir -p "$DATA_DIR"
sudo chown -R 999:999 "$DATA_DIR"
# 第一步:用默认配置启动,让 PG 完成初始化
echo "启动容器(默认配置初始化)..."
docker compose -f docker-compose-perf.yml up -d
echo "等待初始化完成..."
for i in $(seq 1 30); do
if docker exec $CONTAINER pg_isready -U erp_pgsql -d junhong_cmp_test > /dev/null 2>&1; then
echo "✅ 初始化完成"
break
fi
[ $i -eq 30 ] && echo "❌ 超时" && docker logs $CONTAINER && exit 1
sleep 2
done
# 第二步:把优化后的配置覆盖到数据目录
echo "注入优化配置..."
docker cp postgresql-perf.conf $CONTAINER:/var/lib/postgresql/data/postgresql.conf
# 第三步:重启让新配置生效
echo "重启容器..."
docker restart $CONTAINER
echo "等待重启完成..."
for i in $(seq 1 30); do
if docker exec $CONTAINER pg_isready -U erp_pgsql -d junhong_cmp_test > /dev/null 2>&1; then
echo "✅ 重启完成"
break
fi
[ $i -eq 30 ] && echo "❌ 超时" && docker logs --tail 20 $CONTAINER && exit 1
sleep 2
done
# 第四步:启用扩展
echo "启用扩展..."
docker exec $CONTAINER psql -U erp_pgsql -d junhong_cmp_test -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;" 2>/dev/null || echo "pg_stat_statements 需要 shared_preload_libraries跳过"
docker exec $CONTAINER psql -U erp_pgsql -d junhong_cmp_test -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"
# 验证
echo ""
echo "=========================================="
echo " 配置验证"
echo "=========================================="
docker exec $CONTAINER psql -U erp_pgsql -d junhong_cmp_test -c "
SELECT name, setting, unit
FROM pg_settings
WHERE name IN (
'shared_buffers', 'effective_cache_size', 'work_mem',
'random_page_cost', 'effective_io_concurrency',
'max_parallel_workers_per_gather', 'maintenance_work_mem',
'max_connections', 'autovacuum_vacuum_scale_factor'
)
ORDER BY name;
"
echo ""
echo "=========================================="
echo " 部署完成"
echo "=========================================="
echo " Port: 16289"
echo " Database: junhong_cmp_test"
echo " User: erp_pgsql / erp_2025"
echo ""