perf(exporter): 优化分片数据统计实现并发查询
- 引入sync包实现并发控制 - 使用信号量限制最大并发数为10 - 针对每个时间范围启动goroutine并行执行查询 - 利用互斥锁保护total计数的安全更新 - 等待所有并发查询完成后返回总计数结果
This commit is contained in:
parent
bd38bdc374
commit
b2901a9113
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue