用途
sqlite-ops 用于解决 SQLite 在各宿主环境中的实际运维问题,按问题定位给出对应参考文档路径:语句慢或扫描过多、出现 database is locked / SQLITE_BUSY、数据写入错误或约束未生效、需要搜索/JSON/地理/分析类特性、运行在托管或边缘引擎(D1、Turso)、以及损坏、体积、备份、VACUUM 等问题。
主要能力
- 测量纪律:给出四条规则——测语句而非工具调用、同时报告延迟与扫描行数、不要用 CLI 墙钟时间(用引擎自报时长 .timer 或 D1 的 meta.timings.sql_duration_ms)、取 10 次以上中位数并报告区间。
- 索引收益验证:提出用同一语句形状跑在一个已有索引覆盖的列上作为“证明快照”,在不改动生产模式的情况下估算索引收益。文档中的示例证明快照为 6.75 ms,对照组为 171.83 ms。
- EXPLAIN QUERY PLAN 速读:列出计划行含义与判断,如 SEARCH ... USING INDEX / COVERING INDEX 为最佳,SCAN ... USING COVERING INDEX 常可接受,SCAN t 全表扫描需修复,USE TEMP B-TREE FOR ORDER BY / GROUP BY 与 CORRELATED SCALAR SUBQUERY 为成本信号。
- 索引设计速查:按谓词形状给出可索引性与应建索引类型,例如等值与范围可建 B-tree,LIKE 'x%' 在 BINARY 排序的 TEXT 列上可索引,LIKE '%x%' 无法 seek,可用 covering 扫描或 FTS5 trigram,lower(col) 需表达式索引,低选择性状态可用部分索引,json_extract 可用表达式索引或生成列加索引。
- 并发与持久性:针对 SQLITE_BUSY、SQLITE_LOCKED、事务中途 database is locked、读者被写者阻塞、-wal 文件无界增长等给出成因与修复,包含 PRAGMA journal_mode = WAL、busy_timeout、foreign_keys、synchronous 的示例设置与注释。
- 模式设计三大隐性 bug:foreign_keys 默认每连接关闭、类型亲和性不等于类型、ALTER TABLE 能力有限(删列/改类型需 12 步重建流程)。
- 特性模块:FTS5(含 trigram 分词器)、bm25 排序、json_extract / -> / ->>、JSONB(3.45+)、R-tree、窗口函数(3.25+)、ON CONFLICT DO UPDATE(3.24+)、RETURNING(3.35+)。
- 运维:PRAGMA quick_check、integrity_check、VACUUM INTO、.dump、PRAGMA optimize,并提示不要在有写入者时用 cp 复制线上数据库。
- D1 专属:wrangler d1 insights、time-travel info、Sessions API(env.DB.withSession(bookmark))等平台特性,涉及行读成本、限制表、错误目录与导入导出。
- 分诊脚本:scripts/eqp-triage.py 读取 EXPLAIN QUERY PLAN 结果(对数据库运行或管道输入计划文本),按严重程度分类并给出修复提示,发现问题退出码为 10,计划干净退出码为 0。
使用方式
文档以参考文件组织,按需加载,例如 query-performance.md、d1-edge.md、concurrency-durability.md、schema-design.md、feature-modules.md、hosts.md、operations.md 等。示例命令包括:
sqlite3 app.db '.timer on' "SELECT count(*) FROM q_product WHERE org LIKE '%acme%';"
sqlite3 app.db 'SELECT * FROM sqlite_stat1;'
python3 scripts/eqp-triage.py --db app.db \
--sql "SELECT DISTINCT product_id FROM q_product WHERE org LIKE '%acme%'"
适用场景
适用于使用 SQLite 或其托管/边缘变体(Cloudflare D1、libSQL/Turso)的开发者与运维人员,需要排查慢查询、并发锁、数据完整性、特性选型、备份恢复与迁移等问题时参考。
限制
资料未提供具体收费、价格或性能承诺。部分能力依赖 SQLite 版本(如 STRICT 需 3.37+、JSONB 需 3.45+)与编译选项(R-tree 为编译期模块需确认可用性)。D1 存在约束:成本按读取行数计费,绑定参数上限为 100,且没有 PRAGMA 接口。