gpt4 book ai didi

mongodb - Mongodb 索引是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 12:31:01 26 4
gpt4 key购买 nike

I have a collection such as:
{u'_id': ObjectId('5094cc44e3f0f827b3618918'),
u'xxx': 0},
{u'_id': ObjectId('5094cc44e3f0f827b3618919'),
u'xxx': 1},
{u'_id': ObjectId('5094cc44e3f0f827b361891a'),
u'xxx': 2},
{u'_id': ObjectId('5094cc44e3f0f827b361891b'),
u'xxx': 3},
{u'_id': ObjectId('5094cc44e3f0f827b361891c'),
u'xxx': 4}
...

当我创建索引时:

db.test.ensure_index([("_id",-1),("xxx",1)])
db.test.ensure_index([("xxx",1)])

然后,我使用如下解释:

db.test.find({"xxx":1}).sort("_id",-1).skip(5).limit(5).explain()

result is:
{u'allPlans': [{u'cursor': u'BtreeCursor _id_ reverse',
u'indexBounds': {u'_id': [[{u'$maxElement': 1},
{u'$minElement': 1}]]},
u'n': 9,
u'nscanned': 34,
u'nscannedObjects': 34},
{u'cursor': u'BtreeCursor xxx_1',
u'indexBounds': {u'xxx': [[1, 1]]},
u'n': 34,
u'nscanned': 34,
u'nscannedObjects': 34},
{u'cursor': u'BtreeCursor _id_-1_xxx_1',
u'indexBounds': {u'_id': [[{u'$maxElement': 1},
{u'$minElement': 1}]],
u'xxx': [[1, 1]]},
u'n': 10,
u'nscanned': 38,
u'nscannedObjects': 10},
{u'cursor': u'BasicCursor',
u'indexBounds': {},
u'n': 16,
u'nscanned': 34,
u'nscannedObjects': 34}],
u'cursor': u'BtreeCursor xxx_1',
u'indexBounds': {u'xxx': [[1, 1]]},
u'indexOnly': False,
u'isMultiKey': False,
u'millis': 1,
u'n': 5,
u'nChunkSkips': 0,
u'nYields': 0,
u'nscanned': 34,
u'nscannedAllPlans': 140,
u'nscannedObjects': 34,
u'nscannedObjectsAllPlans': 112,
u'scanAndOrder': True,
u'server': u'ubuntu:27017'}

从 n,nscanned 和 nscnnedObjects 的 num 中,我认为它应该使用 u'BtreeCursor id-1_xxx_1' 作为光标,但是为什么它使用 u'cursor': u'BtreeCursor xxx_1', ? 谁能给我一些建议?我对索引优化有一点了解。

最佳答案

索引中字段的顺序很重要;查找和排序示例的最佳复合索引实际上是:

db.test.ensure_index([("xxx",1),("_id",-1)])

由于您的搜索条件是字段“xxx”,因此将此字段放在索引中的第一位会比按 _id 搜索然后过滤到与您的 xxx 匹配的文档找到更多的结果> 标准。

如果您查看 allPlans 中查询优化器考虑的每个计划的 n 数字,则 BtreeCursor xxx_1 索引实际上返回最多结果 (34)。其他索引返回 9、10 和 16 个结果......因此对于给定的搜索条件效率会降低。

有关索引优化的更多信息,这篇文章非常有帮助:Optimizing MongoDB Compound Indexes .

关于mongodb - Mongodb 索引是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13207835/

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