最近公司要优化一些比较慢的接口,然后就找到慢的sql 加索引优化,然后发现有一类的问题都是属于count比较慢的 表数据虽然只有几百万但是sql中用了or加了索引也是很慢,最后决定先用协程将列表和count异步请求,这样就将程序时间限制在执行count中了,因为查列表的时间大大的少于count时间。
先上第一波代码
var wg sync.WaitGroup
wg.Add(1)
// 协程
go func(dbq *gorm.DB) {
// 查询的代码
defer wg.Add(-1)
}(dbq)
dbq.Count(&total)
// 等待协程完成
wg.Wait()
要用协程 自然而然的就这么写了 然后运行的时候拼命的报空指针,一开始以为是dbq没有传进去,用闭包传进去也报错,后面把count注释了发现就好了,后面我就想是不是mysql连接池没有触发,后面把dbp赋值给也给新的传进去也是报空指针,最后实在没办法了,去官网查资料,后面发现 新初始化的 *gorm.DB
或调用 新建会话方法
后,GORM 会创建新的 Statement
实例。因此想要复用 *gorm.DB
,您需要确保它们处于 新建会话模式
所以想用复用gorm最好的办法就是新建会话,因为dbp是带了where条件而不是刚初始化出来的,就有了下一段新的代码了
// 创建新会话
dbq = dbq.Session(&gorm.Session{})
var wg sync.WaitGroup
wg.Add(1)
// 协程
go func(dbq *gorm.DB) {
// 查询的代码
defer wg.Add(-1)
}(dbq)
dbq.Count(&total)
// 等待协程完成
wg.Wait()