为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中提高 rows.Scan() 的性能

在 Go 中提高 rows.Scan() 的性能

Go
沧海一幻觉 2021-08-10 09:39:32
我有一个非常简单的查询,它返回只有两列的几千行:SELECT "id", "value" FROM "table" LIMIT 10000;发出后sql.Query(),我使用以下代码遍历结果集:data := map[uint8]string{}for rows.Next() {    var (        id     uint8        value  string    )    if error := rows.Scan(&id, &value); error == nil {        data[id] = value    }}如果我直接在数据库上运行完全相同的查询,我会在几毫秒内返回所有结果,但是 Go 代码需要更长的时间才能完成,有时几乎需要 10 秒!我开始注释掉代码的几个部分,这似乎rows.Scan()是罪魁祸首。Scan 将当前行中的列复制到 dest 指向的值中。如果参数的类型为 *[]byte,则 Scan 会在该参数中保存相应数据的副本。副本归调用者所有,可以修改和无限期保留。可以通过使用 *RawBytes 类型的参数来避免复制;请参阅 RawBytes 的文档以了解其使用限制。如果参数的类型为 *interface{},则 Scan 会复制底层驱动程序提供的值而不进行转换。如果该值的类型为 []byte,则会进行复制并且调用者拥有该结果。如果我使用*[]byte,*RawBytes或者*interface{}相反,任何人都可以期待任何速度改进吗?查看代码,看起来该convertAssign()函数正在执行此特定查询不需要的很多事情。所以我的问题是:我怎样才能使这个Scan过程更快?我想过重载函数以期望预先确定的类型,但这在 Go 中是不可能的......有任何想法吗?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 983 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信