golang - go-sql-driver/mysql for rows.Next()的性能問題
問題描述
1.當查詢出來的記錄過萬時,遍歷Rows的時間過長,達到1分鐘甚至更多
程序代碼:
rows, err := p.conn.Query(sqlStr, params...)if err != nil { log.Println('mysql query error', err.Error()) return nil, err}log.Println('conn結束:', goutil.GetCurrentTime())//延時關閉Rowsdefer rows.Close()//獲取記錄列if columns, err := rows.Columns(); err != nil { return nil, err} else { //拼接記錄Map values := make([]sql.RawBytes, len(columns)) scans := make([]interface{}, len(columns)) for i := range values {scans[i] = &values[i] } //此處遍歷在3W記錄的時候,長達1分鐘甚至更多 for rows.Next() {_ = rows.Scan(scans...)each := map[string]interface{}{}for i, col := range values { each[columns[i]] = string(col)}rowMaps = append(rowMaps, each) } return rowMaps, nil}
問題解答
回答1:可以用創建多個goroutine 分段查詢數據。使用channl在線程中拿去查詢結構進行迭代。
回答2:這不是golang性能的問題,其他編程語言也會類似。一次性去拿三萬條記錄本來就是個不合理的需求,應該通過分頁來解決,一次只取幾十到幾百條。
相關文章:
1. 在應用配置文件 app.php 中找不到’route_check_cache’配置項2. html按鍵開關如何提交我想需要的值到數據庫3. HTML 5輸入框只能輸入漢字、字母、數字、標點符號?正則如何寫?4. javascript - 請教如何獲取百度貼吧新增的兩個加密參數5. gvim - 誰有vim里CSS的Indent文件, 能縮進@media里面的6. 跟著課件一模一樣的操作使用tp6,出現了錯誤7. PHP類屬性聲明?8. javascript - JS請求報錯:Unexpected token T in JSON at position 09. objective-c - ios 怎么實現微信聯系列表 最好是swift10. java - 安卓接入微信登錄,onCreate不會執行
