memos icon indicating copy to clipboard operation
memos copied to clipboard

[性能]建议增加分页查询优化DB查询性能

Open matoung opened this issue 3 years ago • 3 comments

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

感谢作者,希望项目越做越好!

matoung avatar Nov 29 '22 15:11 matoung

项目中大概的性能瓶颈 tag 是从 memo 中提取的,有一次不可避免的扫全表,全部解析一遍 memo list 实现上也都是扫全表再做各种排序处理 http 一次性传输不分页的数据网络耗时

tag 想优化得动刀,其它的倒是不难优化

zy9306 avatar Nov 30 '22 03:11 zy9306

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的处理能否优化。

matoung avatar Nov 30 '22 07:11 matoung

一次循环里好像有5次sql,总共有 N * 5 次查询,看上去可以通过批量查询从 N * 5 优化到 5 次

zy9306 avatar Dec 01 '22 02:12 zy9306

做了一些相关的优化,通过缓存来减少了 ComposeMemo 里执行查询的次数。 https://github.com/usememos/memos/pull/1741, https://github.com/usememos/memos/pull/1742

boojack avatar May 25 '23 16:05 boojack

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

Issues-translate-bot avatar May 25 '23 16:05 Issues-translate-bot