perf(exporter): 优化分片数据统计实现并发查询

- 引入sync包实现并发控制
- 使用信号量限制最大并发数为10
- 针对每个时间范围启动goroutine并行执行查询
- 利用互斥锁保护total计数的安全更新
- 等待所有并发查询完成后返回总计数结果
This commit is contained in:
zhouyonggao 2025-12-19 18:21:28 +08:00
parent bd38bdc374
commit b2901a9113
1 changed files with 24 additions and 6 deletions

View File

@ -7,6 +7,7 @@ import (
"server/internal/schema"
"server/internal/utils"
"strings"
"sync"
"time"
)
@ -228,15 +229,32 @@ func CountRowsFastChunked(db *sql.DB, ds, main string, filters map[string]interf
})
}
// 并行查询所有分片最多10个并发
var total int64
var mu sync.Mutex
var wg sync.WaitGroup
semaphore := make(chan struct{}, 10) // 控制最多10个并发查询
for _, rg := range ranges {
fl := map[string]interface{}{}
for k, v := range filters {
fl[k] = v
}
fl["create_time_between"] = []string{rg[0], rg[1]}
total += CountRowsFast(db, ds, main, fl)
wg.Add(1)
go func(rangeVal [2]string) {
defer wg.Done()
semaphore <- struct{}{} // 获取信号量
defer func() { <-semaphore }() // 释放信号量
fl := map[string]interface{}{}
for k, v := range filters {
fl[k] = v
}
fl["create_time_between"] = []string{rangeVal[0], rangeVal[1]}
count := CountRowsFast(db, ds, main, fl)
mu.Lock()
total += count
mu.Unlock()
}(rg)
}
wg.Wait()
return total
}