首页 > 解决方案 > MongoDB中唯一的多键哈希索引

问题描述

我有一个包含数十亿文档的集合,需要为文档的每个属性创建一个唯一的多键索引。

问题是,如果我尝试这样做,我会得到一个错误,因为生成的密钥太大了。

pymongo.errors.OperationFailure:WiredTigerIndex::insert:键太大而无法索引,失败

我发现 MongoDB 允许您创建散列索引,这可以解决这个问题,但是它们不能用于多键索引。

我该如何解决这个问题?


我的第一个想法是为我的每个文档创建另一个属性,其中包含其属性的每个值的哈希值,然后在该新字段上创建一个索引。
然而,这意味着每次我希望添加一个新属性时都要重新计算哈希,加上创建哈希和索引所需的过多时间。

标签: mongodbindexingpymongo

解决方案


这是 mongoDB 自 2.6 以来添加的一项功能,以防止索引条目的总大小超过 1024 字节(也称为索引键长度限制)。

在 MongoDB 2.6 中,如果您尝试插入或更新文档以使索引字段的值长于 Index Key Length Limit,则操作将失败并向客户端返回错误。在以前版本的 MongoDB 中,这些操作会成功插入或修改文档,但索引或索引不会包含对文档的引用。

出于迁移目的和其他临时场景,您可以降级到 2.4 处理此用例,其中通过设置此 mongoDB 服务器标志不会触发此异常:

db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )

但是,不建议这样做。

还要考虑为文档的每个属性创建索引可能根本不是最佳解决方案。

您是否检查过您如何查询您的文档以及您在哪些字段上键入?有没有用explain查看查询计划?如果您告诉我们您一直在查询所有字段,则该规则将是一个例外。

以下是推荐的 MongoDB 索引策略

过度索引也是有代价的,应该避免


推荐阅读