缓存查询结果
如果你的问题结果不经常变化,你可能希望存储结果,以便下次任何人访问该问题时,Metabase 可以检索缓存的结果,而不是再次查询数据库。
例如,如果你的数据每天只更新一次,那么每天查询数据库超过一次就没有意义,因为数据不会改变。返回缓存结果可能会快得多,因为你的数据库不必重新计算结果来加载你的问题。
Metabase 中的缓存工作原理
假设你为一个特定问题设置了一个缓存策略。你设置了一个持续时间策略,该策略规定在一小时后使结果失效(并清除缓存)。
当你第一次查看该问题时,Metabase 会检查是否有存储的结果。如果没有找到,它会查询你的数据库,返回结果,并存储(缓存)结果。这些结果将在接下来的一小时内保持有效(根据你设置的一小时持续时间策略)。
如果你在半小时后运行该问题,Metabase 将返回那些存储的结果。
如果你在首次运行后一个多小时再次运行该问题,Metabase 会注意到存储的结果比你的缓存策略允许的要旧。Metabase 将删除存储的结果,对你的数据库运行查询,返回结果,并为将来的查询存储它们。根据你设置的持续时间策略,这个缓存将在接下来的一小时内保持有效。要总是在结果过期时刷新缓存,请参见自动刷新缓存。
查看不同缓存策略如何相互作用。
缓存失效策略
这些策略决定了缓存结果保持有效的时长。
持续时间缓存策略
持续时间缓存策略仅适用于 Pro 和 Enterprise 方案(包括自托管和 Metabase Cloud)。
在一定小时数后使缓存失效并清除。当有人运行查询时,Metabase 会首先检查是否已缓存结果以及这些结果是否仍然有效。如果无效,Metabase 会对数据库运行查询并缓存结果。这些缓存的结果将在您设置的持续时间内保持有效。
计划缓存策略
计划缓存策略仅适用于 Pro 和 Enterprise 方案(包括自托管和 Metabase Cloud)。
选择何时定期使缓存失效。Metabase 仅在人们运行查询时存储结果,并会根据您在此处设置的计划清除缓存的结果。
您可以计划缓存失效时间为:
- 每小时
- 每天
- 每周
- 每月
我们尚不支持农历周期。
自适应缓存策略
使用查询的平均执行时间来确定缓存查询结果的时长。
- 最小查询持续时间:如果问题的平均查询执行时间大于此秒数,Metabase 将缓存该问题。
- 乘数:为了确定每个缓存结果应该保留多长时间,我们取该查询的平均执行时间并乘以您在此处输入的值。结果就是缓存应该保持有效的秒数。例如,如果一个问题平均需要 10 秒返回结果,而您设置的乘数为 100,Metabase 将存储缓存 10 x 100 秒:1000 秒(约 16 分钟)。
每当 Metabase 对数据库运行查询以刷新缓存结果时,它都会重新计算查询的平均执行时间。因此,如果 Metabase 第一次对数据库运行查询需要 5 分钟返回结果,平均执行时间将是 5 分钟。如果下一次对数据库的查询需要 7 分钟返回结果,Metabase 会将平均值更新为 6 分钟(5 和 7 的平均值是 6)。
在 Pro 和 Enterprise 方案中,您可以在使用情况分析集合中查看查询和缓存统计信息。
不缓存结果
如果您为问题、仪表盘或数据库选择“不缓存结果”,Metabase 将不会缓存其结果;它总是会针对数据库运行查询以刷新结果。
自动刷新缓存
当行和列安全或连接模拟权限生效时,自动刷新缓存不适用。在这些权限设置中,Metabase 会忽略自动生成的缓存并运行新的查询(然后会缓存该查询)。因此,对于行和列安全及模拟,缓存仍然有效,只是这种抢先的、自动的缓存不适用于这些情况,因为这些权限设置会根据每个查看者过滤特定的数据。
如果您为问题或仪表盘开启自动刷新缓存,Metabase 将在缓存被您设置的任何缓存策略失效后立即重新运行查询。通常,Metabase 仅在有人在缓存过期后查看该项目时才刷新缓存。因此,通常情况下,当缓存过期后,下一个查看该问题的人将不得不等待查询运行并刷新缓存。但通过自动刷新结果来更新缓存,加载时间将始终尽可能快,人们将始终获得有效的、缓存的结果。
Metabase 在自动刷新缓存时如何处理参数值
在自动刷新结果时,Metabase 将应用默认参数值(如果有)。Metabase 还会缓存最多十个在上一个缓存周期内(由您的缓存策略定义)最常应用的参数值的结果。如果您的提问或仪表盘有多个参数,Metabase 将缓存最多十个最常应用的参数值组合。
例如,假设您有一个带有类别筛选器(默认值为 Doohickey
)的仪表盘,设置为每 24 小时缓存一次结果。在过去的 24 小时内,查看该仪表盘的人们应用了以下值到类别筛选器:Widget
, Gizmo
。当 Metabase 下次刷新缓存时,它将缓存三组结果,每组应用了其中一个参数:Doohickey
(默认值)、Widget
和 Gizmo
。然而,如果在过去的 24 小时内没有人运行该查询,Metabase 将只刷新应用了默认参数值的结果的缓存。
自动缓存日志
要查看 Metabase 为自动刷新缓存而运行的查询,请查看查询日志,并将查询来源
筛选为cache-refresh
。
为仪表盘、问题和数据库设置缓存策略
您可以为不同的实体设置缓存策略。
默认缓存策略
要为您的 Metabase 设置默认缓存策略:按 Cmd/Ctrl + k 打开命令面板并搜索性能。或者,点击齿轮设置图标 > 管理员设置 > 性能 > 数据库缓存。
点击默认策略旁边的按钮,然后选择一个缓存失效策略。
数据库缓存策略
与默认缓存策略相同,但您可以为特定的数据库设置缓存策略。
如果您有连接到 Metabase 的数据库设置为使用默认策略,Metabase 将更新显示以反映当前的默认策略。例如,如果您将默认策略设置为“自适应”,Metabase 将显示“自适应”作为那些设置为“使用默认”的数据库的当前策略。
仪表盘缓存策略
要为仪表盘设置缓存策略,您必须对该仪表盘的集合拥有策展访问权限。
问题缓存策略
要为一个问题设置缓存策略,你必须对该问题的集合拥有策展访问权限。
仪表盘、问题、数据库和默认缓存策略如何交互
如果多个缓存策略影响同一个问题,Metabase 将按以下顺序使用第一个可用的策略:
- 问题
- 仪表盘
- 数据库
- 默认(全站)
问题策略会覆盖仪表盘策略,仪表盘策略会覆盖数据库策略,数据库策略会覆盖默认策略。
清除缓存
要清除缓存并刷新结果:
- 问题和仪表盘:访问该项目,然后点击 信息 > 缓存策略 > 清除缓存(“清除缓存”按钮位于侧边栏底部)。
- 数据库:点击齿轮图标,然后点击管理员设置 > 性能 > 数据库缓存。选择你的数据库,然后点击清除缓存按钮(在页面底部)。
缓存位置
如果您是自托管 Metabase,缓存的问题结果将保存到您的应用程序数据库中。
如果您正在使用 Metabase Cloud,缓存的问题结果将保存到位于美国的 Metabase 服务器上(因为我们的云服务为您管理应用程序数据库)。
延伸阅读
阅读其他版本的 Metabase 的文档。