存储

    Meilisearch 在许多方面都是一个数据库:它存储索引文档以及返回相关搜索结果所需的数据。

    数据库位置

    Meilisearch 在您首次启动实例时创建数据库。 默认情况下,您可以在与 meilisearch 二进制文件位于同一目录的 data.ms 文件夹中找到它。

    数据库位置可能会因多种因素而变化,例如您是否使用 --db-path 实例选项配置了不同的数据库路径,或者您是否正在使用像 Docker 这样的操作系统虚拟化工具。

    LMDB

    从头开始创建和管理数据库是一项艰巨的工作。 尝试重新发明轮子毫无意义,因此 Meilisearch 在底层使用存储引擎。 这使 Meilisearch 团队能够专注于提高搜索相关性和搜索性能,同时抽象出在磁盘和内存中创建、读取和更新文档的复杂任务。

    我们的存储引擎称为 Lightning Memory-Mapped Database (简称 LMDB)。 LMDB 是一个用 C 编写的事务性键值存储,它是为 OpenLDAP 开发的,并具有 ACID 属性。 尽管我们考虑过其他选项,例如 SledRocksDB,但我们选择 LMDB 是因为它为我们提供了性能、稳定性和功能的最佳组合。

    内存映射

    LMDB 将其数据存储在 内存映射文件 中。 从 LMDB 获取的所有数据都直接从内存映射返回,这意味着在数据获取期间没有内存分配或内存复制。

    当 Meilisearch 请求时,磁盘上存储的所有文档都会自动加载到内存中。这确保了 LMDB 始终能最佳地利用可用 RAM 来检索文档。

    为了获得最佳性能,建议提供与数据库在磁盘上占用空间大小相同的 RAM,以便所有数据结构都能装入内存。

    理解 LMDB

    选择 LMDB 有其优点和缺点,尤其是在数据库大小和内存使用方面。我们在此总结 LMDB 最重要的方面,但请查看 LMDB 开发人员的这篇 博客文章 以获取更深入的信息。

    数据库大小

    从 Meilisearch 索引中删除文档时,您可能会注意到磁盘空间使用量保持不变。这是因为 LMDB 内部将该空间标记为可用,但不会将其提供给整个操作系统。这种设计选择带来了更好的性能,因为无需定期执行压缩操作。因此,LMDB(以及 Meilisearch)占用的磁盘空间往往会随着时间的推移而增加。无法精确计算 Meilisearch 实例可以占用的最大空间量。

    内存使用

    由于 LMDB 是内存映射的,因此操作系统负责管理分配给(或未分配给)Meilisearch 的实际内存。

    因此,如果您在服务器上以独立程序运行 Meilisearch,LMDB 将使用它可以使用的最大 RAM。一般来说,为了获得最佳性能,您应该拥有与 Meilisearch 在磁盘上占用的空间大小相同的 RAM。

    另一方面,如果您与其他程序一起运行 Meilisearch,操作系统将根据每个程序的需求管理内存。这使得 Meilisearch 的内存使用在开发中使用时非常灵活。

    提示

    虚拟内存 != 实际内存 虚拟内存是程序从操作系统请求的磁盘空间。它不是程序实际将要使用的内存。

    Meilisearch 始终会要求一定的空间用作内存映射。此空间将用作虚拟内存,但实际使用的真实内存 (RAM) 量将小得多。

    测量的磁盘使用量

    以下测量结果是使用 movies.json 这个包含 19,553 个文档的 8.6 MB JSON 数据集进行的。

    索引后,LMDB 中的数据集大小约为 122MB。

    原始 JSONMeilisearch 数据库在磁盘上的大小RAM 使用量虚拟内存使用量
    9.1 MB224 MB≃ 305 MB205 Gb (内存映射)

    这意味着数据库正在使用 **305 MB 的 RAM 和 224 MB 的磁盘空间。** 请注意,虚拟内存 **仅指您的计算机为 Meilisearch 分配的磁盘空间,并不意味着它实际上正在被数据库使用。** 有关更多详细信息,请参阅内存使用

    警告

    这些指标高度依赖于运行 Meilisearch 的机器。在性能明显不足的机器上运行此测试可能会产生不同的结果。

    重要的是要注意,**没有可靠的方法来预测数据库的最终大小**。这对于市场上几乎所有的搜索引擎都是如此——我们只是唯一一个公开说出来的。

    数据库大小受许多标准影响,包括设置、相关性规则、刻面使用、存在的不同语言的数量等等。