[性能]建议增加分页查询优化DB查询性能
Is your feature request related to a problem?
使用Navicat导入了4000条记录,DB文件近3MB,在J3455的NAS上部署项目,加载备忘录需要7-10秒,在i5的PC上部署验证也需要2-3秒,整体比较慢,初步分析是findMemoRawList没有使用分页查询,在数据量大时查询较慢。
Describe the solution you'd like
建议DB操作增加分页查询功能,以提升大数据量下的性能。
Additional context
感谢作者,希望项目越做越好!
项目中大概的性能瓶颈 tag 是从 memo 中提取的,有一次不可避免的扫全表,全部解析一遍 memo list 实现上也都是扫全表再做各种排序处理 http 一次性传输不分页的数据网络耗时
tag 想优化得动刀,其它的倒是不难优化
sStart := time.Now()
memoRawList, err := findMemoRawList(ctx, tx, find)
fmt.Println("查询耗时:", time.Since(sStart))
sStart2 := time.Now()
list := []*api.Memo{}
for _, raw := range memoRawList {
memo, err := s.ComposeMemo(ctx, raw.toMemo())
if err != nil {
return nil, err
}
list = append(list, memo)
}
fmt.Println("处理耗时:", time.Since(sStart2))
使用time.Since()做了下简单的度量,发现耗时集中在FindMemoList中带循环的ComposeMemo: findMemoRawList查询耗时:345.659254ms 循环调用ComposeMemo处理耗时: 7.03393947s FindMemoList整体:7.379913968s
即单次查询全量DB数据是300多ms(对比使用Python SQLite全查相同的DB还写入文本文件的耗时大约只有160ms),但大头还是在循环ComposeMemo,需要看下ComposeMemo的处理能否优化。
一次循环里好像有5次sql,总共有 N * 5 次查询,看上去可以通过批量查询从 N * 5 优化到 5 次
做了一些相关的优化,通过缓存来减少了 ComposeMemo 里执行查询的次数。 https://github.com/usememos/memos/pull/1741, https://github.com/usememos/memos/pull/1742
Issue is not in English. It has been translated automatically.
Made some related optimizations, reducing the number of queries executed in ComposeMemo through caching. https://github.com/usememos/memos/pull/1741, https://github.com/usememos/memos/pull/1742