亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 1061 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號