性能与缓存

Datasette 运行在 SQLite 之上,而 SQLite 具有出色的性能。对于小型数据库,几乎任何查询都应该在几毫秒内返回结果;对于大型数据库(数百 MB 甚至 GB 的数据),只要您的查询合理利用了数据库索引,性能也会非常出色。

话虽如此,您还可以使用许多技巧来提升 Datasette 的性能。

不可变模式

如果您确定一个 SQLite 数据库文件不会被其他进程修改,您可以告诉 Datasette 以不可变模式打开该文件。

这样做会禁用所有锁定和变更检测,从而提升查询性能。

这也启用了与 HTTP 缓存相关的进一步优化,详情如下所述。

要以不可变模式打开文件,请使用 -i 选项将其传递给 datasette 命令

datasette -i data.db

当您以这种方式打开不可变模式文件时,Datasette 首次启动时也会计算并缓存该数据库中每个表的行数,进一步提升性能。

使用 "datasette inspect"

在大型数据库上计算表的行数可能是一个非常耗时的操作。在不可变模式下,Datasette 只执行一次此计数并缓存结果,但这仍可能导致服务器启动时间增加几秒或更多。

如果您知道数据库永远不会改变,您可以提前计算一次表行数并将其存储在 JSON 文件中,然后在之后启动服务器时使用该文件。

要创建包含数据库计算出行数的 JSON 文件,请使用以下命令

datasette inspect data.db --inspect-file=counts.json

然后您可以在之后启动 Datasette 时指定 counts.json 文件,并使用它来跳过行数计数步骤,加快服务器启动速度

datasette -i data.db --inspect-file=counts.json

在这里,您需要对数据库文件使用 -i 不可变模式,否则 JSON 文件中的计数将被忽略。

在日常使用中您很少需要用到这项优化,但在 发布数据 中描述的一些 datasette publish 命令在将数据库文件部署到托管提供商时会利用这项优化来获得更好的性能。

HTTP 缓存

如果您的数据库是不可变的且保证不会更改,通过启用 HTTP 缓存,您可以从 Datasette 中获得重大的性能提升。

这可以在两个不同的层面发挥作用。首先,它可以告诉浏览器缓存查询结果,并在未来的请求中从浏览器缓存提供服务。

更重要的是,它允许您在 Varnish 等缓存代理后面运行 Datasette,或者使用 Fastly 或 Cloudflare 等托管服务提供的缓存。这可以提供惊人的速度提升,因为查询只需在首次访问时由 Datasette 执行一次 - 所有后续的访问都可以由缓存提供服务。

以这种方式使用缓存代理可以使基于 Datasette 的可视化应用在运行 Datasette 本身于极其廉价的托管服务上时,每秒处理数千次访问。

Datasette 与 HTTP 缓存的集成可以通过结合配置选项和查询字符串参数来启用。

default_cache_ttl 设置定义了所有 Datasette 页面的默认 HTTP 缓存 TTL。除非您更改它,否则默认为 5 秒 - 如果您希望完全禁用 HTTP 缓存,可以将其设置为 0。

您还可以使用 ?_ttl=10 查询字符串参数按请求更改缓存超时时间。当您使用 Datasette JSON API 时,这会很有用 - 您可能决定某个特定查询可以缓存更长时间,或者在某些请求中您可能需要设置 ?_ttl=0,例如当您运行 SQL order by random() 查询时。

datasette-hashed-urls

如果您使用 -i 选项以不可变模式打开数据库文件,您可以确保在 Datasette 服务器的整个生命周期内,该数据库的内容不会更改。

datasette-hashed-urls 插件实现了一项优化,即将数据库内容的 SHA-256 哈希的一部分嵌入到 URL 中来提供数据库服务。

位于 /fixtures 的数据库将改为在 /fixtures-aa7318b 提供服务,并且这些页面将返回一个为期一年的缓存过期头。

然后,这将被浏览器以及 Cloudflare 或 Fastly 等缓存代理缓存,从而带来潜在的显著性能提升。

要安装此插件,请运行以下命令

datasette install datasette-hashed-urls

注意

在 Datasette 0.61 之前,哈希 URL 模式是 Datasette 的一个核心功能,通过 hash_urls 设置启用。现在此实现已被移除,取而代之的是 datasette-hashed-urls 插件。

在 Datasette 0.28 之前,哈希 URL 模式是 Datasette 的默认行为,因为所有数据库文件都被假定为不可变且不会更改。从 0.28 版本开始,除非另有明确配置,否则数据库文件默认为可变。