duanbarong4321 2017-01-05 19:07
浏览 157
已采纳

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

I have troubles with performance when I get 20k-50k and more rows from SELECT * FROM table in rows.scan(&a, &b...). I don't know how to use concurrency in this case because I need to use rows.Next() for iterating, and I can't do it in concurrency.

Performance drops only when I scan results from rows to structure's fields in rows.Scan.

The query takes 5-15 ms, but scanning takes (40k rows) 800-2000ms.

Thank you!

  • 写回答

1条回答 默认 最新

  • drydaenth257216154 2017-01-06 05:53
    关注

    Since 'rows.Next()' is sequential, you would need to split your query into multiple statements, and then work concurrently on them.

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

    Use channels, locks, etc when necessary, based on your use case.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗