数据库
使用 Neon/Lakebase Postgres…
在已有 DATABASE_URL 或需要处理 Neon Postgres 的连接、SQL、schema、检查、搜索时,按此流程操作。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
使用 Neon/Lakebase Pos特定
解决思路
- 先使用父级 `neon` 技能了解 Neon 概览、入门和开发最佳实践;若未安装,从 https://neon.com/docs/ai/skills/neon/SKILL.md 获取,或运行 `neon skills -s neon -y` 安装。
- 明确 Lakebase Postgres 是 Neon 核心数据库,兼容 Postgres,支持任意语言、框架或 ORM;登录、用户、session 和 `@neondatabase/auth` 交给 `neon-auth`。
- 选择组织和项目:若已有 `DATABASE_URL`(提示、环境变量或仓库中)或 `.neon` 文件指向项目,直接使用;不要为了 schema 工作重新列出组织或创建第二个项目。
- 若没有项目:使用 CLI(默认)或 MCP server 列出组织和项目,让用户选择现有项目或创建新项目。
- 获取连接串:若已有 `DATABASE_URL` 就直接用,不要通过 CLI/MCP 再取一个。
- 若没有连接串:使用 CLI(默认)、`neon env pull` 或 MCP server 获取;存入 `.env` 的 `DATABASE_URL`;修改前先读取文件,避免覆盖已有值。
- 按用途选 pooled vs direct:Web 应用或无服务器函数用 pooled(`-pooler`);schema 迁移、`pg_dump`/`pg_restore`、逻辑复制、带临时表的长时分析、需要 `SET` 或 session 状态的管理任务、`LISTEN`/`NOTIFY` 用 direct。
- 选择连接方法和驱动:保留现有 ORM 和驱动。
- 如果没有既定选择且是新的 TypeScript schema 工作,建议 Drizzle:https://neon.com/docs/guides/drizzle.md。
- 根据运行时如何处理代码,参考连接方法指南选择正确驱动:https://neon.com/docs/connect/choose-connection.md。
- Vercel 上使用 `node-postgres`(`npm install pg`),配合 Vercel Fluid compute 和 `import { attachDatabasePool } from "@vercel/functions";`。
- Cloudflare 上使用 `node-postgres`,配合 Cloudflare Hyperdrive。
- Neon Functions 上使用 `node-postgres`,因为函数长运行并跨请求复用连接池。
- 无服务器和边缘环境(例如 Netlify)使用 `@neondatabase/serverless` 驱动:一次性查询用 HTTP transport,事务支持用 WebSocket。链接 https://neon.com/docs/serverless/serverless-driver.md。
- 设置 schema:把 schema 和迁移作为代码管理,避免对数据库运行临时 schema 迁移。
- 若使用 ORM,遵循 ORM 最佳实践;例如 Drizzle 只用于 schema 和迁移管理,除非另有指示。
- 分支:用于隔离环境、迁移测试、预览部署或分支生命周期自动化。
- 分支要点:分支是即时 copy-on-write 克隆,不复制全量数据;每个分支有自己的 compute endpoint;用 Neon CLI 或 MCP server 创建、检查和比较分支。链接 https://neon.com/docs/introduction/branching.md。
- 详细分支创建流程(普通 vs schema-only 分支、reset-from-parent、CLI/MCP 选择)使用 `neon-postgres-branches` 技能;若未安装从 https://neon.com/docs/ai/skills/neon-postgres-branches/SKILL.md 获取,或运行 `neon skills -s neon-postgres-branches -y` 安装。
- 迁移:在生产的某个分支上,用接近生产的数据测试迁移,再应用到生产。
- 运行迁移时使用 direct(非 pooled)连接串;`neon connection-string` 默认返回 direct,确保 hostname 不含 `-pooler` 后缀。
- 故障排查和 Neon 专用性能:先使用 Neon 预定义只读诊断,再手写 catalog 查询;Neon CLI `neon inspect db` 子命令和 Neon MCP server 的 `inspect_database` 工具运行相同检查。
- 当证据指向通用 Postgres 工作(重写查询、选择索引、修改 schema、解释 plan 节点)时,加载 `postgres-best-practices` 技能,并带上诊断证据;Neon compute、cache、连接和平台决策留在本技能。
- 选择 CLI 或 MCP:有终端和认证时优先用 Neon CLI:`neon inspect db <check>`。
- CLI 默认从当前 Neon 上下文解析项目和分支;用 `--project-id`、`--branch`、`--database-name` 覆盖;省略 `--database-name` 表示检查分支上的每个数据库;只在直接检查 Postgres 数据库而非通过 Neon API 解析时用 `--db-url`。
- 使用 Neon MCP 时,调用 `inspect_database`,传入 `projectId` 和一个 `check`;仅在需要时传 `branchId`、`databaseName` 或 `computeId`;省略 `databaseName` 检查分支上所有数据库;仅当结果提示被截断时增大 `limit`。
- 按诊断选择检查:哪些 relation 占存储用 `table-sizes`、`index-sizes`;索引未使用或表被大量扫描用 `unused-indexes`、`seq-scans`;什么已运行 5+ 分钟或持锁用 `long-running-queries`、`locks`;哪些查询总耗时最多用 `outliers`;哪些查询运行最频繁用 `calls`;活跃数据是否适合 compute cache 用 `lfc-hit-rate`、`working-set`;autovacuum 是否落后或空间浪费用 `vacuum-stats`、`bloat`;逻辑复制是否健康用 `replication-slots`、`subscriptions`。
- 不要混淆检查:`long-running-queries` 报告当前正在运行超过 5 分钟的语句;`outliers` 按统计重置以来累计执行时间排序,不按平均延迟排序;`calls` 按同一统计历史的执行次数排序。
- `outliers` 和 `calls` 需要 `pg_stat_statements`;`lfc-hit-rate` 和 `working-set` 需要 `neon` 扩展;若检查提示缺少扩展,先询问再运行建议的 `CREATE EXTENSION` 语句,因为安装扩展会修改数据库。
- 安全解释结果:`unused-indexes` 只是候选列表,不是删除索引的许可;删除前确认观察窗口、约束和工作负载。
- 顺序扫描对小表或读取大部分表的查询可能是正确的;添加索引前检查表大小、选择性和查询计划。
- `bloat` 是统计估算;执行 `VACUUM FULL`、`REINDEX` 或类似修复前确认影响并规划锁或维护。
- Cache 和 Postgres 统计在 compute 重启时重置,包括 scale-to-zero 挂起;解释新的 `lfc-hit-rate`、`working-set`、`vacuum-stats` 或 `pg_stat_statements` 结果前,先运行代表性工作负载。
- Compute 级检查(`lfc-hit-rate`、`working-set`、`replication-slots`)即使检查每个数据库也只运行一次。
- 一个数据库失败可能导致 all-databases 检查失败;用显式 `databaseName` 重试相关检查以隔离问题。
- 按查询检查 Neon cache:标准 `EXPLAIN (ANALYZE, BUFFERS)` 只报告 Postgres shared-buffer 活动,不显示 LFC 或 page prefetching;对安全只读查询添加 Neon 的 `FILECACHE` 和 `PREFETCH` 选项:`EXPLAIN (ANALYZE, BUFFERS, PREFETCH, FILECACHE) SELECT ...;`。
- `File cache: hits` 统计 compute LFC 中的页;`File cache: misses` 统计 LFC 未命中并从数据库存储获取的页;`Prefetch: hits`、`misses`、`expired`、`duplicates` 显示 Neon 在 executor 请求前预取页的效果。
- `FILECACHE` 和 `PREFETCH` 提供该查询的指标且不需要 `neon` 扩展;对比之下 `neon inspect db lfc-hit-rate` 和 `working-set` 提供 compute 级统计且需要该扩展。
- MCP `explain_sql_statement` 可生成标准 plan,但不暴露 `FILECACHE` 或 `PREFETCH` 选项;要通过 MCP 收集这些 Neon 专用指标,用 `run_sql` 执行上面的显式只读 `EXPLAIN` 语句。
- 因为 `ANALYZE` 会执行语句,只在执行安全时使用;不要对 mutating SQL 自主运行;仔细比较冷缓存和热缓存运行,因为首次执行会填充缓存并显著改变后续结果。
- 性能工作流:1) 复现症状并记录时间窗口;2) 从上表运行最小相关 `inspect` 检查;3) 在修改 schema 或 compute 前定位具体查询,用 MCP `explain_sql_statement` 获取标准 plan,或在 LFC/prefetch 重要时用 Neon 专用 `EXPLAIN`;4) 若瓶颈是查询形态、索引、schema、锁或 vacuum 行为,加载 `postgres-best-practices` 并带上检查结果和查询计划;Neon compute、cache、连接和平台决策留在本技能;5) 重跑相同检查和工作负载验证变更。
- 当用户明确需要按平均执行时间排序且带自定义阈值和限制时,用 MCP `list_slow_queries` 而不是 `inspect_database`;除上述显式 `EXPLAIN` 情况外,仅当预定义检查无法回答问题时,才用 `run_sql` 执行只读诊断 SQL。
- Autoscaling:需要 compute 随工作负载自动伸缩并获取 CU 规格和运行时行为指导时使用。链接 https://neon.com/docs/introduction/autoscaling.md。
- Scale to Zero:优化空闲成本并讨论 suspend/resume 与冷启动权衡时使用;空闲 compute 默认 5 分钟后自动 suspend,超时可配置,只有 Launch 和 Scale 计划可以禁用 suspend;suspend 后首次查询通常有冷启动惩罚(约数百 ms);存储保持活跃。链接 https://neon.com/docs/introduction/scale-to-zero.md。
- Instant Restore:需要 point-in-time recovery 或不想走传统备份恢复流程时使用;历史窗口取决于计划限制;可从历史时间点创建分支;Time Travel 查询可用于历史检查工作流。链接 https://neon.com/docs/introduction/branch-restore.md。
- Read Replicas:读密集工作负载需要专用只读 compute 且不复制存储时使用;副本是共享同一存储的只读 compute endpoint;创建快且可独立于主 compute 扩展;典型用例:分析、报表、读密集 API。链接 https://neon.com/docs/introduction/read-replicas.md。
- Connection Pooling:无服务器或高并发环境需要安全可扩展的 Postgres 连接管理时使用;Neon pooling 使用 PgBouncer;在 endpoint hostname 加 `-pooler` 使用 pooled 连接;在突发并发的无服务器运行时尤其重要。链接 https://neon.com/docs/connect/connection-pooling.md。
- IP Allow Lists:需要按受信网络、IP 或 CIDR 范围限制数据库访问时使用。链接 https://neon.com/docs/introduction/ip-allow.md。
- Logical Replication:集成 CDC 管道、外部 Postgres 同步或基于复制的数据移动时使用;Neon 支持原生逻辑复制工作流;可用于与外部 Postgres 系统之间复制。链接 https://neon.com/docs/guides/logical-replication-guide.md。
- Lakebase Search:需要语义、全文或混合搜索时使用;语义搜索读 `references/vector-search.md`;BM25 排名的全文搜索读 `references/full-text-search.md`;组合语义和词法结果读 `references/hybrid-search.md`。链接:Lakebase Search 入门 https://neon.com/docs/ai/lakebase-search-get-started;`lakebase_vector` 参考 https://neon.com/docs/extensions/lakebase-vector;`lakebase_text` 参考 https://neon.com/docs/extensions/lakebase-text。
- Gotcha pooled vs direct:Neon 对同一数据库给两个连接串:pooled(hostname 带 `-pooler` 后缀)和 direct/unpooled(不带 `-pooler`)。`neon env pull` 写入 `DATABASE_URL` 和 `DATABASE_URL_UNPOOLED`。Pooled 经 PgBouncer transaction mode 路由,不支持 session 级操作。
- 选择:Pooled(`DATABASE_URL`)用于应用正常查询流量,尤其是无服务器和每请求一连接的工作负载;Direct(`DATABASE_URL_UNPOOLED`)用于 schema 迁移(Prisma Migrate、Drizzle Kit、Alembic 等)、`pg_dump`/`pg_restore`、逻辑复制、`LISTEN`/`NOTIFY`,以及任何依赖 `SET` 或其他 session 状态的操作。
- 在 pooled 连接上运行迁移、dump 或复制可能失败,且错误不会指明 pooling:例如 Prisma Migrate 的 `prepared statement "s0" already exists`;`SET search_path` 不能持久到自身事务之后,导致下一查询报 `relation "mytable" does not exist`;写操作间歇性命中只读事务(`SQLSTATE 25006`),该 pooled backend 继承自更早客户端。
- 迁移工具通常同时接收两个连接串——例如 Prisma 的 `directUrl` 和 `url`——把 `directUrl` 指向 direct 串,而不是交换 `DATABASE_URL` 并让应用失去 pooling。参见 https://neon.com/docs/connect/connection-pooling.md。
适用边界 · 注意事项
- 新后端、Auth、文件、Functions 和 LLM 调用不属于本技能,应使用父级 `neon` 技能。
- 登录、用户、session 和 `@neondatabase/auth` 应使用 `neon-auth`。
- 若问题本质是通用 Postgres 查询、索引、schema、锁或 vacuum 优化,应加载 `postgres-best-practices`;非 Neon/Lakebase Postgres 访问路径不适用本技能。