最近折腾一个本地优先的side project,用SQLite存状态,图方便把后端那套UUID直接搬进来当主键,结果性能血崩。这就像把V8的隐藏类优势全扔了,SQLite的rowid本质是64位整数,天然自带隐式聚簇索引,查询局部性极好。简单说换成UUIDv4之后,B-tree页分裂直接炸裂,随便查几条数据延迟能飙三倍,VACUUM都救不回来。
更恶心的是调试体验。以前看日志,rowid自带插入时序,一眼能定位问题边界;现在满屏随机字符串,想做因果追踪跟全表扫描差不多,REPL里补全都没法用。很多JS工具链比如Drizzle或better-sqlite3默认并不拦你,但开源方案里这种看起来通用实则埋雷的默认配置特别坑。如果你在做Electron或者OPFS场景下的本地数据库,主键老老实实自增整数,UUID扔给业务字段当唯一索引,这才是debug