Prisma Postgres 常见问题
关于 Prisma Postgres 的工作原理、查询计费方式以及如何与 Prisma ORM 集成的常见问题。
一般问题
我可以在不使用 Prisma ORM 的情况下使用 Prisma Postgres 吗?
是的,您可以通过直接连接,将 Prisma Postgres 与任何数据库库或工具配合使用。
如何从 GitHub 登录切换到电子邮件和密码登录?
如果您之前使用 GitHub 注册,并希望切换到电子邮件和密码登录,请按照以下步骤操作:
- 验证您的 GitHub 电子邮件地址
- 检查与您的 GitHub 账户关联的主要电子邮件地址(例如,从您的 GitHub 个人资料或通知设置中)。
- 创建新的电子邮件/密码账户
- 前往电子邮件/密码注册页面。
- 使用与您的 GitHub 账户关联的相同电子邮件地址创建新账户。
- 我们的系统将自动将您的新电子邮件/密码账户连接到您现有数据。
- 测试您的登录
- 退出并尝试使用您刚刚创建的电子邮件和密码登录。
如果您遇到任何问题,请联系我们的支持团队,以协助链接您的账户。
VS Code 无法识别 $extends 方法
如果您将用于 Accelerate 的 Prisma 客户端扩展添加到当前在 VS Code 中打开的现有项目中,编辑器可能无法立即识别 $extends 方法。
这可能是 TypeScript 服务器尚未识别重新生成的 Prisma 客户端的问题。要解决此问题,您需要重启 TypeScript。
- 在 VS Code 中,打开命令面板。您可以通过按 F1 或选择视图 > 命令面板来完成。
- 输入
typescript并选择并运行 TypeScript: Restart TS server 命令。
VS Code 现在应该能够识别 $extends 方法。
Prisma Postgres 支持哪些地区?
Prisma Postgres 目前在以下地区可用:
| 地区代码 | 位置 |
|---|---|
us-west-1 | 旧金山 |
us-east-1 | 北弗吉尼亚 |
eu-west-3 | 巴黎 |
eu-central-1 | 法兰克福 |
ap-northeast-1 | 东京 |
ap-southeast-1 | 新加坡 |
我们正在持续努力扩展地区支持。如果您想请求特定地区,请通过 Discord 联系我们。
定价
Prisma Postgres 根据消耗的操作和存储计费。请访问定价页面了解详细信息,并阅读我们的解释基于操作的计费的博客文章,详细了解什么是操作以及此计费模型的工作原理。
什么是操作?
每次您与数据库交互时都会计算一个操作。读取、写入、简单或复杂。它都只算作一个。
一个操作可以是
- Prisma ORM 查询(使用 Prisma ORM 时)
- SQL 查询(使用直接 TCP 连接时)
查询执行时间会影响 Prisma Postgres 的定价吗?
不,Prisma Postgres 的成本仅基于操作数量,而不是执行它们所需的计算量。
无论查询执行需要 10 毫秒还是 10 秒,其定价影响都保持不变。
使用 Prisma ORM 和直接 TCP 连接的定价有何不同?
基于操作的定价的基本原则对于 Prisma ORM 和直接 TCP 连接保持不变。但是,根据您是使用 Prisma ORM 还是直接 SQL 与数据库交互,操作的定义有所不同:
- 使用 Prisma ORM 时:通过 Prisma Client 发送的查询(例如
prisma.user.findMany()) - 使用其他工具时:通过直接连接发送的 SQL 查询(例如
SELECT * from "User")
请注意,一个 Prisma ORM 查询可能转换为多个 SQL 查询,这可能会使使用 Prisma ORM 比直接 SQL 更经济。
读写查询的成本相同吗?
是的,读写查询都被同等视为操作,并以相同的方式计费。
SELECT 1 查询是否算作可计费操作?
是的,像 SELECT 1 这样的查询算作一个操作,并将相应计费(即使查询中没有实际数据被访问)。
如何在 Prisma ORM 中估算操作数量?
您可以通过集成 Prometheus 等应用程序性能监控工具来估算 Prisma ORM 中的操作使用情况。
我可以使用哪些策略来优化每次操作的成本?
Prisma Postgres 按操作计费。您使用单个操作执行的任务越多,您的账单就越低。以下是一些减少操作数量的技巧:
-
批量写入:使用
createMany、updateMany或deleteMany,而不是循环执行单行调用。// One operation, three users
await prisma.user.createMany({
data: [
{ name: 'Alice' },
{ name: 'Bob' },
{ name: 'Carol' },
],
}) -
使用嵌套关系辅助函数,例如
connectOrCreate或set,以在单个操作中创建或链接相关记录。// Post and (if needed) its author, all in one request
await prisma.post.create({
data: {
title: 'Hello World',
author: {
connectOrCreate: {
where: { email: 'alice@example.com' },
create: { name: 'Alice', email: 'alice@example.com' },
},
},
},
}) -
当单个查询彼此不依赖时,优先选择常规(数组)事务而不是交互式事务。
// Interactive transaction: counted as 2 operations
await prisma.$transaction(async (tx) => {
await tx.user.create({ data: { name: 'Alice' } })
await tx.post.create({ data: { title: 'Hello', authorId: 1 } })
})
// Array transaction: counted as 1 operation
await prisma.$transaction([
prisma.user.create({ data: { name: 'Alice' } }),
prisma.post.create({ data: { title: 'Hello', authorId: 1 } }),
])
如果后续查询需要之前查询的结果(例如,您需要刚刚创建的用户 ID),请坚持使用交互式事务以确保正确性。否则,批处理和数组事务允许您将多个查询合并为一个计费操作,从而降低操作计数和成本。
是否有示例工作负载来估算我的预期费用?
我们将演示三个示例工作负载,并估算小型、中型和大型工作负载的账单。每个都结合了实际的月活跃用户 (MAU) 数量、每个用户典型的每日活动量以及四舍五入的存储占用空间。
我们将使用以下公式估算每月账单:
total_ops = MAUs x actions_per_user_per_day x 30
billable_ops = total_ops - included_ops_for_plan
ops_cost = (billable_ops ÷ 1_000_000) x plan_rate
billable_storage_GB = storage_used_GB - free_storage_for_plan
storage_cost = billable_storage_GB x storage_rate_for_plan
total_monthly_cost = ops_cost + storage_cost + base_plan_fee
您可以使用自己的 MAU 计数、活动级别和使用的存储量,根据上述公式预测任何计划的成本。
我们将把每个工作负载与一个付费计划及其相应的定价详情关联起来,例如,小型工作负载的 Starter plan,中型工作负载的 Pro plan,以及大型工作负载的 Business plan。然后我们将公式应用于示例工作负载,以生成每月账单的粗略估算。例如:
以下是每个定价计划的详情:
- 入门计划 (Starter plan) - 每百万次操作 8 美元
- 基本计划费用 - 每月 10 美元
- 包含操作 - 1,000,000
- 存储 - 10 GB 免费,之后每额外 GB 2 美元
- 专业计划 (Pro plan) - 每百万次操作 2 美元
- 基本计划费用 - 每月 49.00 美元
- 包含操作 - 10,000,000
- 存储 - 50 GB 免费,之后每额外 GB 1.5 美元
- 商业计划 (Business plan) - 每百万次操作 1 美元
- 基本计划费用 - 每月 129.00 美元
- 包含操作 - 50,000,000
- 存储 - 100 GB 免费,之后每额外 GB 1 美元
我们也有免费计划,但在以下计算中我们将其排除,因为它仅用于评估,不适用于生产工作负载。您还可以在定价页面了解每个计划的更多定价详情。
入门计划小型工作负载示例:
一个拥有约 500 个月活跃用户的爱好项目或早期副项目。每个用户每天执行约 10 次操作,整个数据库使用约 0.5 GB 存储空间。根据这些假设,您将使用以下公式计算每月账单:
total_ops=500x10x30=150000billable_ops=0(150,000 次操作低于 100 万次免费操作)ops_cost= $0storage_cost= $0(0.5 GB 低于已包含的 10 GB 存储空间)base_plan_fee= $10
total_monthly_cost = 每月 $10.00
专业计划中型工作负载示例:
一个不断增长的 SaaS 产品,服务约 5000 个月活跃用户。高级用户平均每天执行约 40 次操作,应用程序存储约 6 GB 数据。根据这些假设,您将使用以下公式计算每月账单:
total_ops=5000x40x30=6000000billable_ops=0(600 万次操作低于 1000 万次免费操作)ops_cost= $0storage_cost= $0(6 GB 低于已包含的 50 GB 存储空间)base_plan_fee= $49.00
total_monthly_cost = 每月 $49.00
商业计划大型工作负载示例:
一个生产级的面向消费者的应用程序,处理约 50000 个月活跃用户。用户每天大量使用约 60 次操作,产生大量流量,数据集达到约 40 GB。根据这些假设,您将使用以下公式计算每月账单:
total_ops=50000x60x30=90000000billable_ops=90000000-50000000=40000000ops_cost= (40000000÷1000000) =40.00x $1= $40.00storage_cost= $0.00(40 GB 低于已包含的 100 GB 存储空间)base_plan_fee= $129.00
total_monthly_cost = $40.00 + $129.00 = 每月 $169.00
缓存操作的计费方式相同吗?
每个请求,无论是命中数据库还是从缓存中提供服务,都算作一个操作。Prisma Postgres 采用统一的每操作价格,从不收取出口流量费用,因此缓存响应不会产生任何额外或减少的费用。这种统一费率使计费模型可预测,并避免了每个请求的复杂性。
如果我通过 Vercel 使用 Prisma Postgres,如何升级我的计划?
要通过 Vercel 升级您的计划,请按照以下步骤操作:
- 打开您的 Vercel 控制面板。
- 前往 Vercel 团队中的集成选项卡。
- 点击 Prisma 集成上的管理。
- 导航到设置选项卡。
- 在当前安装计划级别下,点击更改计划。
- 选择您想要升级到的计划。
缓存
Prisma Postgres 包含内置连接池和全局缓存。这些功能通过优化查询的路由和缓存来提高性能。
Prisma Postgres 的缓存层如何知道从哪个区域获取缓存?
Prisma Postgres 的缓存层底层使用 Cloudflare,它采用 Anycast 进行网络寻址和路由。传入请求将被路由到其网络中最近且有能力高效处理请求的数据中心或“节点”。要了解更多关于其工作原理的信息,我们建议您查阅 Anycast。
如何使 Prisma Postgres 的缓存失效?
如果您使用的是付费计划,可以通过 $accelerate.invalidate API 按需使缓存失效,或者您可以项目级别使整个缓存失效,每天最多五次。此限制是根据您的计划设置的。您可以通过 Accelerate 配置页面进行管理。
Prisma Postgres 缓存层的一致性模型是什么?
Prisma Postgres 中的缓存层没有一致性模型。它不是一个需要节点达成共识的分布式系统(因为数据只存储在离用户最近的缓存节点中)。然而,Prisma Postgres 缓存节点中缓存的数据不会传播到其他节点,因此缓存层在设计上不需要一致性模型。
Prisma Postgres 实现了直读缓存策略,特别适用于读密集型工作负载。
缓存提供的数据新鲜度取决于您查询中定义的缓存策略。有关为查询选择正确缓存策略的更多信息,请参阅本节。
Prisma Postgres 的缓存层与 Redis 等其他缓存工具有什么不同?
Prisma Postgres 的缓存层
- 是一个专用缓存,允许您使用缓存策略在查询级别优化代码中的数据访问。另一方面,Redis 和 Memcached 等工具是通用缓存,旨在具有适应性和灵活性。
- 是一个托管服务,可减少构建和维护缓存服务所需的时间、风险和工程工作。
- 默认情况下是全球分布的,可减少查询延迟。其他缓存工具需要额外配置才能使其在全球范围内可用。
什么时候不应该使用 Prisma Postgres 的缓存功能?
Prisma Postgres 的缓存层是一个全局数据缓存和连接池,允许您在查询级别优化代码中的数据访问。虽然使用 Prisma Postgres 进行缓存可以大大提升应用程序的性能,但它可能并非总是您用例的最佳选择。
如果出现以下情况,此全局缓存功能可能不适合您的应用程序:
-
您的应用程序仅在特定区域内使用,并且您的应用服务器和数据库都位于同一区域的同一网络中。例如,如果您的应用服务器和数据库位于同一区域和网络中,数据库查询可能会快得多。但是,如果您的应用服务器与数据库位于不同的区域或网络中,缓存节点将加速您的查询,因为数据将缓存在离您的应用程序最近的数据中心。
-
您的应用程序数据在检索时始终需要是最新的,这使得建立合理的缓存策略变得困难。
配置 cacheStrategy 时,ttl 参数允许的最大值是多少?
生存时间 (ttl) 参数可以设置为最长一年。但是,需要注意的是,如果缓存中的项目不经常访问,可能会被逐出。
根据我们的实验,我们发现缓存项可以持续大约 18 小时。虽然如果缓存项被频繁访问,它们可能会在缓存中停留更长时间,但不能保证。
即使是频繁访问的项也可能偶尔从缓存中被逐出。无论其活动级别如何,项不太可能存活一个月或更长时间。
为什么有时会出现意外的缓存行为?
当项目观察到较高的负载时,Prisma Postgres 的缓存层表现最佳。许多缓存操作,例如将数据提交到缓存和刷新陈旧数据,都是异步发生的。在对缓存层进行基准测试时,我们建议使用循环或负载测试方法。这将更好地模拟高负载场景并减少低频操作造成的异常值。
Prisma 操作通过 HTTP 发送到 Prisma Postgres。因此,对 Prisma Postgres 的第一个请求必须建立 HTTP 握手,并可能因此产生额外的延迟。我们正在探索未来减少这种初始请求延迟的方法。
Prisma Postgres 的缓存节点在哪些地区可用?
Prisma Postgres 的缓存层运行在 Cloudflare 的网络上,缓存命中由 Cloudflare 的 300 多个地点提供服务。您可以在这里找到 Prisma Postgres 缓存节点可用的地区:https://www.cloudflare.com/network/。
缓存查询结果失效需要多长时间?
由于缓存需要全局清除,因此难以提供具体的时间范围。但是,缓存数据最终会保持一致,通常在几秒钟内传播到所有 PoP。在极少数情况下,可能需要更长时间。
这里有一个演示应用,用于测试缓存查询结果失效所需的时间。
Invalidate 和 Revalidate 有什么区别?
Invalidate(失效):缓存条目被删除,下次请求将获取新数据,导致缓存未命中。这会删除陈旧数据,但可能导致响应变慢,直到缓存重新填充。
Revalidate(重新验证):缓存条目主动更新,确保下次请求使用缓存中的最新数据。这使缓存保持有效,并通过避免缓存未命中维持更快的响应时间。
什么是按需缓存失效?
按需缓存失效允许应用程序在数据更改时立即更新特定的缓存数据,而无需等待常规的缓存刷新周期。这可以确保用户看到的信息准确且最新。
何时应该使用缓存失效 API?
缓存失效 API 在数据一致性不能等待缓存标准过期或重新验证时至关重要。主要用例包括:
- 内容更新:当发生关键更改(例如已发布文章的编辑、产品更新或个人资料修改)需要立即可见时。
- 库存管理:在实时应用程序(如库存或预订系统)中,库存水平、可用性或预订状态必须反映最新信息。
- 高优先级数据:对于时间敏感数据,例如突发新闻或紧急通知,用户立即看到最新信息至关重要。
在这些场景中使用按需缓存失效有助于仅刷新必要的数据,在确保为用户提供准确、最新信息的同时,保持系统性能。
连接池
我可以增加我的 Prisma Postgres 实例的查询持续时间和响应大小限制吗?
是的,您可以根据您的订阅计划增加 Prisma Postgres 的限制。以下是可配置的限制:
| 限制 | 免费版 | 入门版 | 专业计划 | 商业计划 |
|---|---|---|---|---|
| 查询超时 | 最长 10 秒 | 最长 10 秒 | 最长 20 秒 | 最长 60 秒 |
| 交互式事务超时 | 最长 15 秒 | 最长 15 秒 | 最长 30 秒 | 最长 90 秒 |
| 响应大小 | 最大 5 MB | 最大 5 MB | 最大 10 MB | 最大 20 MB |
请查看定价页面了解更多关于可用计划及其相应限制的详细信息。
虽然您可以根据您的订阅计划增加这些限制,但仍然建议优化您的数据库操作。在我们的故障排除指南中了解更多信息。
查询优化
Prisma Postgres 允许通过 Prisma Optimize 进行查询优化,并提供性能建议,以帮助您在开发过程中改进数据库查询。您可以将其与 Prisma Postgres 一起启用,或者也将其与您自己的数据库一起使用,但设置和集成步骤有所不同。
您可以自动实施优化吗?
Prisma Postgres 的查询优化功能提供关于如何改进数据库查询的洞察和建议。它不会修改任何现有查询或您的 Prisma 模式。
录制会话保留多长时间?
存储保留期没有限制。查询性能录制会话将一直存储,直到您明确删除它。
建议限制每月重置吗?
是的,建议使用量在每个日历月月初重置。例如,如果您在月底前使用了 5 条建议,那么下个月初,您的使用量将重置为 0。
如果我超出入门计划的建议限制,会收取费用吗?
是的,如果您使用的是入门计划,在一个计费周期内超出 5 条建议将导致在该周期结束时收取 $5 的费用。欲了解更多信息,请访问我们的定价页面。
如何跟踪已查看的 Prisma AI 建议进行计费?是根据生成的建议还是查看的建议来计算的?
它们是根据已查看的建议来计算的。一旦您从建议表中点击一条建议并查看该建议的详细页面,它就被视为已查看。
我可以在生产环境中启用 Prisma Postgres 的查询优化吗?
不,Prisma Postgres 的查询优化不适用于生产环境。它专门为本地开发设计,在该阶段提供有价值的洞察和优化。虽然技术上可以在生产环境中运行,但这样做可能会导致性能问题或意外行为,因为这不是为了处理生产工作负载的复杂性和规模而构建的。为了获得最佳体验,我们建议仅在开发环境中测试查询优化。
您可以在客户端扩展中使用 enable 属性,以仅在开发环境中运行它。默认情况下,enable 属性设置为 true。
import { PrismaClient } from '@prisma/client'
import { withOptimize } from "@prisma/extension-optimize"
const prisma = new PrismaClient().$extends(
withOptimize({
apiKey: process.env.OPTIMIZE_API_KEY,
enable: process.env.ENVIRONMENT === 'development',
})
);
为什么会看到“'[optimize] HTTP 409 Conflict: There is no active recording to write queries to”警告?
当 Prisma Optimize 收到查询但没有活动的录制会话时,可能会出现此警告。通常,这可能发生在 Prisma Optimize 无意中在您的生产环境中启用时。Prisma Optimize 专门设计用于本地开发环境,不应在生产环境中启用。为避免此警告,请确保 Prisma Optimize 配置为仅在开发期间运行。
如果您在开发环境中看到此警告,请确保您已在 Prisma Optimize 控制面板中启动了录制会话。