在使用mongo数据库的时候,查询数据,结果大概有2万多条,
有个方法是 自动把query的结构映射到结构体中的。这两万多条,时间久不说了,1分多,还数据残缺。
var dbresult []MogoResp
error := c.Find(bson.M{"currcode": "903"}).All(&dbresult)
就这么两句代码,卡了超过一分多。mongo是使用索引,得到结果是极其快。就是把结果转为 结构体 数组的时候,龟速龟速。
这个mongo的操作工具是 gopkg.in/mgo.v2。
怎么可能这么慢呢,真是出了奇,求指教.....
===========================
感觉源码使用了反射,导致查出 2万多条数据,用了将近2分钟。
func (iter *Iter) All(result interface{}) error {
resultv := reflect.ValueOf(result)
if resultv.Kind() != reflect.Ptr || resultv.Elem().Kind() != reflect.Slice {
panic("result argument must be a slice address")
}
slicev := resultv.Elem()
slicev = slicev.Slice(0, slicev.Cap())
elemt := slicev.Type().Elem()
i := 0
for {
if slicev.Len() == i {
elemp := reflect.New(elemt)
if !iter.Next(elemp.Interface()) {
break
}
slicev = reflect.Append(slicev, elemp.Elem())
slicev = slicev.Slice(0, slicev.Cap())
} else {
if !iter.Next(slicev.Index(i).Addr().Interface()) {
break
}
}
i++
}
resultv.Elem().Set(slicev.Slice(0, i))
return iter.Close()
}
试试一个方法,dbresult 提前 make 出 20000 的空间。
这样可以减少内存分配,但或许不是主要问题,建议你可以使用 pprof 工具分析下。
还有,这个库我没用过,提个想法,能不能确定下 mongo 手动执行和程序执行的是一样的语句。