第 5 篇:「索引的生命周期」— 从创建到过期,从过期到更新 开场:索引不是一成不变的前面我们讨论了 SQLite 的速度、并发控制、降级策略。但有一个基本问题没问:索引的内容从何而来?什么时候更新?怎样保证搜索结果不过期?索引的四个阶段阶段 1: 构建(Build) ├─ 首次启动时 ├─ 扫描所有文件 ├─ 提取符号信息 └─ 填充 SQLite 表 时间:5-21s(一次性) 阶段 2: 稳定(Stable) ├─ 工作中 ├─ SQLite 有效且最新 ├─ 搜索直接用 FTS5 └─ 性能:7ms 时间:大部分时间 阶段 3: 增量更新(Incremental Update) ├─ 用户保存文件 ├─ VSCode 触发 onDidChangeTextDocument 事件 ├─ 后台异步更新改动的文件符号 └─ 数据库逐步更新,用户无感知 时间:改一个文件 ~ 10-50ms(后台) 阶段 4: 过期/重建(Stale/Rebuild) ├─ SQLite 损坏 ├─ 或文件 N 个同时改动(超过更新队列) ├─ 自动检测 └─ 从阶段 1 重来 时间:偶发,通常不触发阶段 1:构建(Build)初始化流程classSQLiteIndexStore{asyncinitialize():Promisevoid{conststartTime=Date.now();console.log('Initializing SQLite index...');// 步骤 1: 检查数据库文件是否存在constdbPath=this.getDbPath();constexists=awaitfs.pathExists(dbPath);if(!exists){console.log('Database not found, creating...');// 步骤 2: 创建新数据库和 FTS5 表awaitthis.createDatabase();// 步骤 3: 扫描工作区constfiles=awaitthis.workspace.getAllFiles();console.log(`Found${files.length}files, extracting symbols...`);// 步骤 4: 批量插入符号awaitthis.indexAllFiles(files);constelapsed=Date.now()-startTime;console.log(`Index created in${elapsed}ms,${this.totalSymbols}symbols`);}else{console.log('Database exists, loading...');// 步骤 5: 打开现有数据库awaitthis.openDatabase();// 步骤 6: 验证完整性awaitthis.validateIndex();console.log('Index loaded successfully');}// 步骤 7: 启动文件监听(增量更新)this.startWatchingFiles();}privateasynccreateDatabase():Promisevoid{awaitthis.db.exec(`CREATE VIRTUAL TABLE code_index USING fts5( id UNINDEXED, name, content, file UNINDEXED, line UNINDEXED, column UNINDEXED, type UNINDEXED, -- function/class/interface/type/const scope UNINDEXED -- global/local/method ); CREATE TABLE IF NOT EXISTS meta ( key TEXT PRIMARY KEY, value TEXT ); INSERT INTO meta (key, value) VALUES ('created_at', ?); INSERT INTO meta (key, value) VALUES ('version', '1.0');`,[newDate().toISOString()]);}privateasyncindexAllFiles(files:File[]):Promisevoid{letcompleted=0;// 批量处理(提高性能)constbatch=100;for(leti=0;ifiles.length;i+=batch){constchunk=files.slice(i,i+batch);// 并发处理本批文件awaitPromise

相关新闻

最新新闻

python-第8天:字符串常见操作全解析

python-第8天:字符串常见操作全解析

Python 基础进阶:字符串常见操作全解析 在 Python 的编程世界里,字符串(String) 是处理频率最高的数据类型之一。无论是处理网页爬虫获取的文本、分析日志文件,还是构建简单的用户交互界面,字符串操作都是…

2026/8/19 23:20:26
嗨现场平替版大屏互动软件|手机号一键绑定终身用,年会婚礼会议签到抽奖投票全搞定

嗨现场平替版大屏互动软件|手机号一键绑定终身用,年会婚礼会议签到抽奖投票全搞定

温馨提示:文末有联系方式 🔑 手机号绑定即享终身使用权 只需用本人手机号完成首次,系统自动全部功能——后续0额外、0年费、0、0限制,不限使用时间、不限参与人数、不限互动次数。 ⚡ 功能全面对标嗨现场,实为高性价…

2026/8/19 23:20:26
2025年顶级测试管理工具横评与选型实战指南

2025年顶级测试管理工具横评与选型实战指南

1. 测试管理工具:从“记录本”到“效率引擎”的演进如果你还在用Excel表格、Word文档,甚至是一堆零散的TXT文件来管理测试用例、跟踪缺陷、协调团队进度,那么是时候停下来看看2025年的风景了。测试管理工具早已不是十年前那个简单的“电子记录…

2026/8/19 23:20:26
从特斯拉市值超越通用看汽车产业估值逻辑与商业模式变革

从特斯拉市值超越通用看汽车产业估值逻辑与商业模式变革

1. 从“异类”到“标杆”:特斯拉市值超越通用汽车的深层逻辑2017年4月,一则新闻震动了全球汽车界和资本市场:特斯拉的市值首次超越了拥有百年历史的通用汽车。这不仅仅是一个数字游戏,它更像是一记重锤,敲醒了所有沉浸…

2026/8/19 23:20:26
树莓派部署MagicMirror:无镜化信息看板搭建与Node.js环境配置指南

树莓派部署MagicMirror:无镜化信息看板搭建与Node.js环境配置指南

1. 项目缘起:当“魔镜”不再需要镜子 几年前,我第一次在朋友家看到一个运行着MagicMirror的智能镜子,那种感觉非常奇妙。天气、新闻、日程、股票信息,所有你需要的信息都优雅地显示在一块单向玻璃后面,看起来就像魔法一…

2026/8/19 23:20:26
Day53-Docker:Dockerfile最佳实践 + 多阶段构建 + docker-compose编排

Day53-Docker:Dockerfile最佳实践 + 多阶段构建 + docker-compose编排

为什么你的 Spring Boot 镜像又大、又慢、还跑不起来把 Spring Boot 应用部署上线的老大难,往往不是代码 bug,而是"在我机器上能跑,到你环境起不来"——JDK 版本不一致、内网依赖拉不到、glibc 差异让 native 库直接崩。Docker 解决…

2026/8/19 23:15:26