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