golang - go-sql-driver/mysql for rows.Next()的性能問題
問題描述
1.當(dāng)查詢出來的記錄過萬時,遍歷Rows的時間過長,達(dá)到1分鐘甚至更多
程序代碼:
rows, err := p.conn.Query(sqlStr, params...)if err != nil { log.Println('mysql query error', err.Error()) return nil, err}log.Println('conn結(jié)束:', goutil.GetCurrentTime())//延時關(guān)閉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記錄的時候,長達(dá)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:可以用創(chuàng)建多個goroutine 分段查詢數(shù)據(jù)。使用channl在線程中拿去查詢結(jié)構(gòu)進(jìn)行迭代。
回答2:這不是golang性能的問題,其他編程語言也會類似。一次性去拿三萬條記錄本來就是個不合理的需求,應(yīng)該通過分頁來解決,一次只取幾十到幾百條。
相關(guān)文章:
1. 視頻文件不能播放,怎么辦?2. mysql - 把一個表中的數(shù)據(jù)count更新到另一個表里?3. 請教使用PDO連接MSSQL數(shù)據(jù)庫插入是亂碼問題?4. mysql 查詢身份證號字段值有效的數(shù)據(jù)5. visual-studio - Python OpenCV: 奇怪的自動補(bǔ)全問題6. mysql - 分庫分表、分區(qū)、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處7. node.js - nodejs開發(fā)中常用的連接mysql的庫8. python bottle跑起來以后,定時執(zhí)行的任務(wù)為什么每次都重復(fù)(多)執(zhí)行一次?9. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題10. Python爬蟲如何爬取span和span中間的內(nèi)容并分別存入字典里?
