Prisma Postgres 常见问题
关于 Prisma Postgres 的工作方式、查询计费方式以及它如何与 Prisma ORM 集成的常见问题。
通用
我可以在没有 Prisma ORM 的情况下使用 Prisma Postgres 吗?
是的,您可以通过直接连接,将 Prisma Postgres 与任何数据库库或工具结合使用。
如何从 GitHub 登录切换到电子邮件和密码登录?
如果您之前使用 GitHub 注册,并希望切换到电子邮件和密码登录,请遵循以下步骤
- 验证您的 GitHub 电子邮件地址
- 检查与您的 GitHub 帐户关联的主要电子邮件地址(例如,从您的 GitHub 个人资料或通知设置中查看)。
- 创建新的电子邮件/密码帐户
- 前往电子邮件/密码注册页面。
- 使用与您的 GitHub 帐户绑定的相同电子邮件地址来创建新帐户。
- 我们的系统将自动把您的新电子邮件/密码帐户连接到您现有数据。
- 测试您的登录
- 退出登录,然后尝试使用您刚创建的电子邮件和密码登录。
如果您遇到任何问题,请联系我们的支持团队以协助关联您的帐户。
VS Code 无法识别 $extends
方法
如果您将 Prisma Client Accelerate 扩展添加到当前在 VS Code 中打开的现有项目中,编辑器可能无法立即识别 $extends
方法。
这可能是 TypeScript 服务器尚未识别重新生成的 Prisma Client 的问题。要解决此问题,您需要重新启动 TypeScript。
- 在 VS Code 中,打开命令面板。您可以按 F1 或选择视图 > 命令面板来执行此操作。
- 输入
typescript
并选择并运行TypeScript: Restart TS server命令。
VS Code 现在应该能够识别 $extends
方法了。
定价
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 的metrics
预览功能集成,来估算 Prisma ORM 中的操作使用量。启用 metrics
预览功能后,查看 prisma_client_queries_total
指标以获取操作数。
Prisma Postgres 使用 prisma_client_queries_total
计数器,该计数器跟踪发送到数据库的每个客户端操作以计算您的费用。有关配置 Prometheus 和监控应用程序的详细分步教程,请参阅我们的完整指南。
我可以使用哪些策略来优化每个操作的成本?
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 - 100_000
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
您可以使用自己的月活跃用户数、活动级别和已用存储空间,利用上述公式估算任意套餐的成本。
我们将把每个工作负载与一个套餐及其相应的定价详情关联起来,例如,小型工作负载对应Starter plan(入门套餐),中型工作负载对应Pro plan(专业套餐),大型工作负载对应Business Annual plan(商业年度套餐)。然后我们将对示例工作负载应用这些公式,以生成月度账单的粗略估算。例如
以下是每个定价套餐的详细信息
- Starter plan(入门套餐) - 每百万操作 $18
- 基本套餐费 - 每月 $0
- 存储 - 1 GB 免费,之后每额外 1 GB $2
- Pro plan(专业套餐) - 每百万操作 $8
- 基本套餐费 - 每月 $49.00
- 存储 - 5 GB 免费,之后每额外 1 GB $1.5
- Business Annual plan(商业年度套餐) - 在每月 50-100M 使用范围内每百万操作 $4
- 基本套餐费 - 每月 $129.00
- 存储 - 10 GB 免费,之后每额外 1 GB $1
您还可以在定价页面上了解每个套餐的更多定价详情。
Starter plan(入门套餐)上的小型工作负载示例:
一个拥有约 500
月活跃用户 (MAU) 的爱好或早期阶段副项目。每个用户每天执行约 10
次操作,整个数据库使用约 0.5
GB 存储空间。基于这些假设,您将使用以下公式计算月度账单
total_ops
(总操作数) =500
x10
x30
=150000
billable_ops
(可计费操作数) =50000
ops_cost
(操作成本) = (50000
÷1000000
) x $18
= $0.90
storage_cost
(存储成本) = $0
(0.5 GB 低于 1 GB 免费额度)base_plan_fee
(基本套餐费) = $0
total_monthly_cost
(月总成本) = 每月 $0.90
Pro plan(专业套餐)上的中型工作负载示例:
一个不断增长的 SaaS 产品,服务约 5000
月活跃用户 (MAU)。高级用户平均每天执行约 40
次操作,应用程序存储约 6
GB 数据。基于这些假设,您将使用以下公式计算月度账单
total_ops
(总操作数) =5000
x40
x30
=6000000
billable_ops
(可计费操作数) =5900000
ops_cost
(操作成本) = (5900000
÷1000000
) =5.9
x $8
= $47.20
storage_cost
(存储成本) = (6
GB -5
GB) x $1.50
= $1.50
base_plan_fee
(基本套餐费) = $49.00
total_monthly_cost
(月总成本) = $47.20
+ $1.50
+ $49.00
= 每月 $97.70
Business Annual plan(商业年度套餐)上的大型工作负载示例:
一个生产级的面向消费者应用程序,处理约 50000
月活跃用户 (MAU)。每个用户每天约 60
次操作的重度使用产生大量流量,数据集达到约 40
GB。基于这些假设,您将使用以下公式计算月度账单
total_ops
(总操作数) =50000
x60
x30
=90000000
billable_ops
(可计费操作数) =89900000
ops_cost
(操作成本) = (89900000
÷1000000
) =89.9
x $4
= $359.6
storage_cost
(存储成本) = (40
GB -10
GB) x $1
= $30.00
base_plan_fee
(基本套餐费) = $129.00
total_monthly_cost
(月总成本) = $359.6
+ $30.00
+ $129.00
= 每月 $518.60
缓存操作的计费方式相同吗?
每个请求,无论是命中数据库还是从缓存中提供,都算作一个操作。Prisma Postgres 采用统一的操作单价,且不收取出口流量费用,因此缓存响应不会产生额外或减少的费用。这种统一费率使计费模型可预测,并避免了按请求计费的复杂性。
缓存
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):缓存条目被主动更新,确保下一次请求使用缓存中的最新数据。这使缓存保持有效,并通过避免缓存未命中保持更快的响应时间。
什么是按需缓存失效?
按需缓存失效允许应用程序在特定缓存数据发生变化时立即更新,而无需等待常规缓存刷新周期。这可确保为用户提供准确和最新的信息。
我何时应该使用缓存失效 API?
当数据一致性无法等待缓存的标准过期或重新验证时,缓存失效 API 至关重要。主要用例包括
- 内容更新:当发生需要立即可见的关键更改时,例如已发布文章的编辑、产品更新或个人资料修改。
- 库存管理:在实时应用程序(如库存或预订系统)中,库存水平、可用性或预订状态必须反映最新信息。
- 高优先级数据:对于时间敏感的数据,如突发新闻或紧急通知,用户立即看到最新信息至关重要。
在这些场景中使用按需缓存失效有助于仅刷新必要的数据,在保持系统性能的同时,确保为用户提供准确、最新的信息。
连接池
我可以增加我的 Prisma Postgres 实例的查询持续时间和响应大小限制吗?
是的,您可以根据您的订阅套餐提高 Prisma Postgres 的限制。以下是可配置的限制
限制 | Starter | Pro Plan | Business Plan |
---|---|---|---|
查询超时 | 最长 10 秒 | 最长 20 秒 | 最长 60 秒 |
交互式事务超时 | 最长 15 秒 | 最长 30 秒 | 最长 90 秒 |
响应大小 | 最长 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 控制面板中启动了录制会话。