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. javascript - 引入 simditor,但是显示标签,这个怎么解决。2. android - 目前有哪些用Vue.js开发移动App的方案?3. 为什么要通过常量的方式拐弯抹角的写呢,直接写DSN之类的不好吗4. python 发邮件5. python - 关于flask 静态文件配置404的问题6. defined这个实验代码我这里不对哇7. android - 安卓实现类似QQ刚换聊天背景的功能8. python - scrapy获取网页指定内容,后翻到下一页继续,固定循环次数。。问题9. javascript - easyui textbox绑定onchange事件不能获取最新的文本框的值10. javascript - 仿着echarts官网的地图做了个例子,但是只显示出来了地点,没有画出飞机动态效果??急