gpt4 book ai didi

mongodb - 仅对 MongoDB 中的部分字段建立索引

转载 作者:可可西里 更新时间:2023-11-01 10:34:09 26 4
gpt4 key购买 nike

有没有办法只在 MongoDB 的字段的一部分上创建索引,例如前 10 个字符?我找不到它的记录(或在这里询问)。

MySQL 的等价物是 CREATE INDEX part_of_name ON customer (name(10));

原因:我有一个包含单个字段的集合,其长度从几个字符到超过 1000 个字符不等,平均为 50 个字符。由于有大约一亿个文档,因此很难将完整索引放入内存(根据统计数据,使用 8% 的数据进行测试时,索引已经达到 400MB)。仅对字段的第一部分建立索引会将索引大小减少大约 75%。在大多数情况下,搜索词很短,不是全文搜索。

解决方法是为每个项目添加 10 个(小写)字符的第二个字段,对其进行索引,然后添加逻辑以在搜索词超过 10 个字符时过滤结果(以及额外的字段 is probably needed anyway对于不区分大小写的搜索,除非有人有更好的方法)。不过,这似乎是一种丑陋的方式。

[稍后添加]

我尝试添加第二个字段,其中包含主字段的前 12 个小写字符。这不是一个很大的成功。

以前,平均对象大小是 50 字节,但我忘记了包括 _id 和其他开销,所以我的主字段长度(只有一个)平均接近 30 字节而不是 50。然后,第二个字段索引包含_id 和其他开销。

最终结果(对于我的 8% 样本)是主字段上的索引为 415MB,而 12 字节字段上的索引为 330MB - 仅节省了 20% 的空间,不值得。我可以复制整个字段(以解决不区分大小写的搜索问题),但实际上我应该重新考虑 MongoDB 是否是完成这项工作的正确工具(或者只是购买更多内存并使用两倍的磁盘空间)。

[稍后添加]

这是一个典型的文档,带有源字段和短小写字段:

{ "_id" : ObjectId("505d0e89f56588f20f000041"), "q" : "Continental Airlines", "f" : "continental " }

索引:

db.test.ensureIndex({q:1});

db.test.ensureIndex({f:1});

“f”索引在较短的字段上工作,是“q”索引大小的 80%。我并不是要暗示我在索引中包含了 _id,只是它需要使用那个某处显示索引将指向的位置,因此这是一种开销,可能有助于解释为什么较短的键几乎没有什么区别。

对索引的访问本质上是随机的,它的任何部分都不会比其他任何部分更容易被访问。完整文件的总索引大小可能为 5GB,因此对于那个索引来说并不极端。为其他搜索案例添加一些其他字段,以及它们的关联索引,以及小写数据的副本,确实开始加起来,并且更有可能进行分页和交换(这是一个 8GB 服务器),这就是为什么我开始研究更多简明索引。

最佳答案

MongoDB 无法在字段值的一部分上创建索引。您最好的方法是按照您的建议创建第二个字段。

由于您无论如何都需要第二个字段来进行不区分大小写的高效搜索,因此没有理由不创建它。

索引不存储文档的“_id”字段,它们存储一个 DiscLoc 结构,这是一个低得多的结构:详情请看这里

另请注意,“丑陋”实际上是“关系思维”的产物。 (作为我自己的长期 SQL 用户,我经常发现学习 MongoDB 最难的部分是un——学习我的关系思维。)在面向文档的数据库中,反规范化和复制数据实际上是最好的实践。

关于mongodb - 仅对 MongoDB 中的部分字段建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com