🎨 Improve data indexing performance when editing doc https://github.com/siyuan-note/siyuan/issues/10976

This commit is contained in:
Daniel 2024-04-11 22:56:43 +08:00
parent f5ceb847f4
commit 0e8f5b24c4
No known key found for this signature in database
GPG Key ID: 86211BA83DF03017

View File

@ -27,6 +27,7 @@ import (
"regexp" "regexp"
"runtime" "runtime"
"runtime/debug" "runtime/debug"
"strconv"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -981,19 +982,35 @@ func deleteBlocksByIDs(tx *sql.Tx, ids []string) (err error) {
ftsIDs = append(ftsIDs, "\""+id+"\"") ftsIDs = append(ftsIDs, "\""+id+"\"")
} }
stmt := "DELETE FROM blocks WHERE id IN (" + strings.Join(ftsIDs, ",") + ")" var rowIDs []string
stmt := "SELECT ROWID FROM blocks WHERE id IN (" + strings.Join(ftsIDs, ",") + ")"
rows, err := tx.Query(stmt)
if nil != err {
logging.LogErrorf("query block rowIDs failed: %s", err)
return
}
for rows.Next() {
var rowID int64
if err = rows.Scan(&rowID); nil != err {
logging.LogErrorf("scan block rowID failed: %s", err)
rows.Close()
return
}
rowIDs = append(rowIDs, strconv.FormatInt(rowID, 10))
}
rows.Close()
stmt = "DELETE FROM blocks WHERE ROWID IN (" + strings.Join(rowIDs, ",") + ")"
if err = execStmtTx(tx, stmt); nil != err { if err = execStmtTx(tx, stmt); nil != err {
return return
} }
ftsIDsMatch := strings.Join(ftsIDs, " OR ") stmt = "DELETE FROM blocks_fts WHERE ROWID IN (" + strings.Join(rowIDs, ",") + ")"
stmt = "DELETE FROM blocks_fts WHERE ROWID IN (SELECT ROWID FROM blocks_fts WHERE blocks_fts MATCH 'id:(" + ftsIDsMatch + ")')"
if err = execStmtTx(tx, stmt); nil != err { if err = execStmtTx(tx, stmt); nil != err {
return return
} }
if !caseSensitive { if !caseSensitive {
stmt = "DELETE FROM blocks_fts_case_insensitive WHERE ROWID IN (SELECT ROWID FROM blocks_fts_case_insensitive WHERE blocks_fts_case_insensitive MATCH 'id:(" + ftsIDsMatch + ")')" stmt = "DELETE FROM blocks_fts_case_insensitive WHERE ROWID IN (" + strings.Join(rowIDs, ",") + ")"
if err = execStmtTx(tx, stmt); nil != err { if err = execStmtTx(tx, stmt); nil != err {
return return
} }