当我从SELECT * FROM table
rows.scan(&a, &b...)
获得20k-50k及更多行时,我遇到了性能问题。在这种情况下,我不知道如何使用并发,因为我需要使用rows.Next()
进行迭代,而且我无法在并发中执行。
只有当我将结果从行扫描到rows.Scan
中的结构字段时,性能才会下降。
查询需要5-15毫秒,但扫描需要(40k行)800-2000毫秒。
谢谢!
答案 0 :(得分:1)
由于'rows.Next()'是顺序的,您需要将查询拆分为多个语句,然后同时对它们进行操作。
func main() {
queries := []string{
"SELECT * FROM abc where a < 10000",
"SELECT * FROM abc where a >= 10000 && a <= 30000",
"SELECT * FROM abc where a > 30000",
}
for _, query := range queries {
go dbCall(query)
}
}
func dbCall(query string) {
rows, _ := db.Query(query)
for rows.Next() {
var a, b, c int
_ = rows.Scan(&a, &b, &c)
// Process row
}
}
根据您的使用情况,在必要时使用频道,锁等。