如果一个项目的目录齐全的话,约4320个目录。比如阶段划分上,6个阶段,下级专业划分,9个专业,再下级文档类型方面划分,约8种,再下级,建筑物分类,约10种,连乘下来就是4320个,这么多数据构造成一个树状目录,即嵌套的json数据,不能通过频繁的数据库查询来做。比如开始的时候,代码是通过查询数据库来判断是否有下级:
//递归构造项目树状目录
func walk(id int64, node
*FileNode) {
//列出当前id下子节点,不要列出孙节点……
files, err :
= models.GetProjSonbyId(id)
if err
!=
nil {
beego.Error(err)
}
// 遍历目录
for _, proj :
= range files {
id :
= proj.Id
title :
= proj.Title
code :
= proj.Code
// 将当前名和id作为子节点添加到目录下
child :
= FileNode{id, title, code, []
*FileNode{}}
node.FileNodes
= append(node.FileNodes,
&child)
// 如果遍历的当前节点下还有节点,则进入该节点进行递归
if models.Projhasson(proj.Id) {
walk(proj.Id,
&child)
}
}
return
}
里面使用了2个数据库查询,速度见下图:
这段代码处理4320个数据花了2.71s,导致整个页面响应时间达到5.23s.
优化思路,一次性把所有数据都取出来,利用程序循环处理,而不是频繁查询数据库。
优化后就没有查询数据库了。
效果如下:
从2.71s降到38ms,但是页面响应时间还是超过了0.5s,达到1.03s。猜测应该是treeview加载这个json数据的时间吧。
这段代码处理4320个数据花了2.71s,导致整个页面响应时间达到5.23s.
优化思路,一次性把所有数据都取出来,利用程序循环处理,而不是频繁查询数据库。
//递归构造项目树状目录
func maketreejson(cates, categories []
*models.Project, node
*FileNode) {
// 遍历目录
for _, proj :
= range cates {
id :
= proj.Id
title :
= proj.Title
code :
= proj.Code
// 将当前名和id作为子节点添加到目录下
child :
= FileNode{id, title, code, []
*FileNode{}}
node.FileNodes
= append(node.FileNodes,
&child)
slice :
= getsons(id, categories)
// 如果遍历的当前节点下还有节点,则进入该节点进行递归
if len(slice)
>
0 {
maketreejson(slice, categories,
&child)
}
}
return
}
//取得数组的下级目录
func getsons(idNum int64, categories []
*models.Project) (slice []
*models.Project) {
// slice := make([]*models.Project, 0)
for _, k :
= range categories {
if k.ParentId
== idNum {
slice
= append(slice, k)
}
}
return slice
}
效果如下:
从2.71s降到38ms,但是页面响应时间还是超过了0.5s,达到1.03s。猜测应该是treeview加载这个json数据的时间吧。