限制在自管理部署上扫描的文本索引项数量
如果对大型数据集执行文本搜索查询,单字段文本索引可能会扫描大量条目以返回结果,这可能会导致查询速度变慢。
要提高查询性能,您可以创建复合文本索引,并在文本搜索查询中包含等值匹配。 如果复合索引包含等值匹配使用的字段,则索引扫描的条目更少,返回结果的速度更快。
关于此任务
在此示例中,商店经理查询包含这些文档的 inventory
集合:
db.inventory.insertMany( [ { _id: 1, department: "tech", description: "lime green computer" }, { _id: 2, department: "tech", description: "wireless red mouse" }, { _id: 3, department: "kitchen", description: "green placemat" }, { _id: 4, department: "kitchen", description: "red peeler" }, { _id: 5, department: "food", description: "green apple" }, { _id: 6, department: "food", description: "red potato" } ] )
经理对特定部门内的项目执行文本搜索查询。
department
和 description
字段上的复合文本索引将扫描的索引键限制为仅指定 department
内的文档。与 description
字段上的单字段文本索引相比,复合文本索引可提供更高的性能。
步骤
在包含以下字段的 inventory
集合上创建复合索引:
department
字段上的升序或降序索引键description
字段上的text
索引键
db.inventory.createIndex( { department: 1, description: "text" } )
结果
创建复合索引后,文本搜索查询仅扫描与 department
字段上指定的相等条件匹配的文档。
例如,以下查询会扫描 department
等于 kitchen
的文档,其中 description
字段包含字符串 green
:
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } )
输出:
[ { _id: 3, department: 'kitchen', description: 'green placemat' } ]
查看已检查的文档数量
要查看扫描了多少个文档才返回查询,请查看查询的 executionStats
:
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } ).explain("executionStats")
检查的索引键数量显示在 totalKeysExamined
字段中。检查更多索引键的查询通常需要更长时间才能完成。
当复合索引位于 department
和 description
时,查询仅检查 一个索引键。集合中只有一个 kitchen
是 department
并且 description
包含字符串 green
的文档。
但是,如果查询仅对 description
字段使用单字段文本索引,则查询将检查三个索引键。集合中有三个文档,其中 description
字段包含字符串 green
。
在类似上例中的小型集合中,单字段和复合文本索引的性能差异并不明显。但是,在较大的集合中,增加索引项扫描会明显影响性能。为获得最佳性能,请创建限制扫描索引项数量的文本索引,以最好地适应等值匹配。