跳到主要内容

常见问题

关于 Prisma Postgres 的工作原理、查询计费方式以及如何与 Prisma ORM 集成的常见问题解答。

通用

可以在没有 Prisma ORM 的情况下使用 Prisma Postgres 吗?

Prisma Postgres 旨在与 Prisma ORM 和 Accelerate 扩展一起使用,以获得最佳性能和可伸缩性。

虽然技术上可以通过TCP 隧道进行连接,但这种方法仅用于工具目的,例如命令行工具或查询编辑器。

警告

我们强烈建议不要使用 TCP 隧道进行应用级访问。它并非为此目的而设计,以这种方式使用可能会对您的应用性能产生负面影响。

我们计划将来启用应用级 TCP 访问,以便您可以将 Prisma Postgres 与其他 ORM 一起使用。

如何从 GitHub 登录切换到电子邮件和密码登录?

如果您之前使用 GitHub 注册,并想切换到电子邮件和密码登录,请按照以下步骤操作:

1. 验证您的 GitHub 电子邮件地址

  • 检查与您的 GitHub 帐户关联的主电子邮件地址(例如,从您的 GitHub 个人资料或通知设置中)。

2. 创建新的电子邮件/密码账户

  • 前往电子邮件/密码注册页面。
  • 使用与您的 GitHub 帐户关联的**同一电子邮件地址**创建新帐户。
  • 我们的系统会自动将您的新电子邮件/密码帐户连接到您现有的数据。

3. 测试您的登录

  • 退出登录并尝试使用您刚创建的电子邮件和密码进行登录。
注意

如果您遇到任何问题,请联系我们的支持团队以获得帐户关联方面的帮助。

VS Code 无法识别 `$extends` 方法

如果您将 Accelerate 的 Prisma Client 扩展添加到当前在 VS Code 中打开的现有项目中,编辑器可能不会立即识别 `$extends` 方法。

这可能是由于 TypeScript 服务器尚未识别重新生成的 Prisma Client 导致的问题。要解决此问题,您需要重启 TypeScript。

  1. 在 VS Code 中,打开命令面板。您可以通过按 F1 或选择**视图** > **命令面板**来打开。
  2. 输入 `typescript` 并选择并运行**TypeScript: Restart TS server** 命令。

VS Code 现在应该能够识别 `$extends` 方法了。

定价

查询执行时间会影响 Prisma Postgres 的定价吗?

不,Prisma Postgres 的成本仅基于*操作数量*(即 Prisma ORM 查询),而不是执行这些操作所需的计算量。

无论查询执行需要 10 毫秒还是 10 秒,其定价影响都是相同的。

读写查询成本相同吗?

是的,读写查询被同样计算为*操作*并以相同的方式计费。

`SELECT 1` 查询会算作可计费操作吗?

是的,如果通过 Prisma ORM 提交,`SELECT 1` 这样的查询会被计算为一次操作,并相应地计费(即使查询中没有实际访问数据)。

缓存

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` 参数的最大允许值是多少?

Time-to-live (`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 秒最多 20 秒最多 60 秒
交互式事务超时最多 15 秒最多 30 秒最多 90 秒
响应大小最多 5 MB最多 10 MB最多 20 MB

请查看定价页面,了解有关可用计划及其相应限制的更多详细信息。

警告

虽然您可以根据您的订阅计划增加这些限制,但**仍**建议优化您的数据库操作。在我们的故障排除指南中了解更多信息。

查询优化

Prisma Postgres 允许通过Prisma Optimize 进行查询优化,并提供性能建议以帮助您在开发期间改进数据库查询。您可以在 Prisma Postgres 中启用它,或者在您自己的数据库中使用它,但设置和集成步骤不同。

可以自动实现优化吗?

Prisma Postgres 的查询优化功能提供了关于如何改进数据库查询的见解和建议。它不会更改任何现有查询或您的 Prisma schema。

记录会话保留多久?

存储保留期没有限制。查询性能记录会话将一直存储,直到您明确删除它。

建议限制每月重置吗?

是的,建议使用量在每个日历月开始时重置。例如,如果您在月底使用了 5 条建议,那么在下个月开始时,您的使用量将重置为 0。

如果我在入门计划中超出建议限制,会收费吗?

是的,如果您使用的是入门计划,在一个计费周期内超出 5 条建议将导致在该周期结束时产生 5 美元的费用。有关更多信息,请访问我们的定价页面

如何跟踪查看的 Prisma AI 建议进行计费?是根据生成还是查看的建议来计算?

它们是根据查看的建议来计算的。一旦您从建议列表中点击一条建议并查看该建议的详细页面,它就被视为已查看。

可以在生产环境中为 Prisma Postgres 启用查询优化吗?

不,Prisma Postgres 的查询优化功能不应在生产环境中启用。它专门设计用于本地开发,在此阶段提供有价值的见解和优化。虽然技术上可以在生产环境中运行它,但这样做可能会导致性能问题或意外行为,因为它并非旨在处理生产工作负载的复杂性和规模。为了获得最佳体验,我们建议仅在开发环境中测试查询优化功能。

您可以使用客户端扩展中的 `enable` 属性使其仅在开发环境中运行。默认情况下,`enable` 属性设置为 `true`。

script.ts
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',
})
);