mongo读书笔记——索引

本文通过实际测试展示了MongoDB中索引的重要性,对比了无索引和使用索引的查询效率。讨论了如何利用limit优化查询,以及建立索引后对查询速度的显著提升。同时,解释了复合索引的概念,并通过示例说明了不同类型的查询如何利用索引,包括点查询、多值查询以及排序查询。最后,提到了MongoDB在排序大量数据时的限制和应对策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引:类似于书籍的目录,在索引中找到条目以后,就可以直接跳转到目标文档的位置,这能使查找速度提高几个数量级。不使用索引的查询称为全表扫描,即服务器必须查找完一整本书才能找到查询结果。

速度测试:在表中插入一百万条数据

> for(i=0;i<1000000;i++){
... db.users.insert(
... {
... "i":i,
... "username":"user"+i,
... "age":Math.floor(Math.random()*120),
... "created":new Date()
... }
... );
... }
WriteResult({ "nInserted" : 1 })

然后查询一个随机的用户名(新版mongo已经改了,如果按mongo权威指南则得不到该信息),可以看到扫描了一百万个文档才查询出来,执行时间1046ms。因为不知道集合里的username字段是唯一值得,mogo不得不查看集合中的每一个文档。为了优化查询,将查询结果限制为1,这样就在找到一个文档之后就会停止了。

> db.users.find({username:"user101"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "test.users",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "username" : {
                                "$eq" : "user101"
                        }
                },
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "username" : {
                                        "$eq" : "user101"
                                }
                        },
                        "direction" : "forward"
                },
                "rejectedPlans" : [ ]
        },
        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 1,
                "executionTimeMillis" : 1046,
                "totalKeysExamined" : 0,
                "totalDocsExamined" : 1000000,
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "username" : {
                                        "$eq" : "user101"
                                }
                        },
                        "nReturned" : 1,
                        "executionTimeMillisEstimate" : 986,
                        "works" : 1000002,
                        "advanced" : 1,
                        "needTime" : 1000000,
                        "needYield" : 0,
                &n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小卒曹阿瞒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值