用途:该技能用于在 Convex 项目中排查与优化性能问题,适用于查询变慢、触发过多重渲染、设计索引、避免 N+1 查询、处理高竞争写入(OCC 错误)、反规范化数据、优化响应式查询以及处理计数器或聚合等场景。
主要能力与原则:核心原则包括查询应为 O(log n) 而非 O(n)、积极反规范化(Convex 无 join,需内嵌相关数据或维护查找表)、减少文档读取以降低依赖与重渲染、避免热点文档。反规范化模式包括内嵌关联数据、反规范化计数(避免为计数而 collect,可用 take(100) 显示“99+”或维护 channelStats 计数表)、反规范化布尔字段(写入时计算 isImportant 并建索引)。
索引设计:复合索引可前缀搜索,一个复合索引可服务多种查询模式;命名包含全部字段如 by_channel_and_author;避免冗余索引;不要用 .filter(),应使用索引或在 TypeScript 中过滤。
并发与 OCC:Convex 使用乐观并发控制,同一文档并发读写会触发自动重试。热点写入解决方案包括分片(随机 shardId 分散写入、读取时汇总)、Workpool(maxParallelism: 1 串行化写入)、Aggregate 组件(原子增减)。一次性后台任务用 ctx.scheduler,需要并发控制或串行化时用 Workpool。
事务边界:action 中多次 ctx.runQuery 非事务性,应合并为单个事务查询;多次 mutation 非原子,应合并为单个 mutation 批量写入。
查询优化:使用 take() 限制数量、Promise.all 并行取数、需要单条时用 .first() 或 .unique() 而非 collect。常见陷阱包括 N+1 查询、无索引无界查询、单文档热点。
限制与规则:代码库启用 @typescript-eslint/no-explicit-any,禁止使用 any,否则构建失败。资料未提供安装命令、收费与平台信息。