如何快速获取Go中的多行?

时间:2017-01-05 19:07:45

标签: sql postgresql go

当我从SELECT * FROM table rows.scan(&a, &b...)获得20k-50k及更多行时,我遇到了性能问题。在这种情况下,我不知道如何使用并发,因为我需要使用rows.Next()进行迭代,而且我无法在并发中执行。

只有当我将结果从行扫描到rows.Scan中的结构字段时,性能才会下降。

查询需要5-15毫秒,但扫描需要(40k行)800-2000毫秒。

谢谢!

1 个答案:

答案 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
    }
}

根据您的使用情况,在必要时使用频道,锁等。