0

0

mongodb索引使用以及使用explain与profile调优

php中文网

php中文网

发布时间:2016-06-07 16:31:09

|

1521人浏览过

|

来源于php中文网

原创

索引是用来加快查询速度的,事物都有双面性的,同时在每次插入、更新和删除操作时都会产生额外的开销。索引有时并不能解决查询慢的问题,一般来说,返回集合中一半以上的结果,全表扫描要比查询索引更高效些。 创建太多索引,会导致插入非常慢,同时还会占用

索引是用来加快查询速度的,事物都有双面性的,同时在每次插入、更新和删除操作时都会产生额外的开销。索引有时并不能解决查询慢的问题,一般来说,返回集合中一半以上的结果,全表扫描要比查询索引更高效些。 创建太多索引,会导致插入非常慢,同时还会占用很大空间。可以通过explain和hint工具来分析。 索引有方向的,倒序还是升序。 每个集合默认的最大索引个数为64个。

1. 查看索引

> db.jiunile_events.getIndexes();
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "jiunile_login.jiunile_events",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "stmp" : -1
                },
                "ns" : "jiunile_login.jiunile_events",
                "name" : "stmp_-1"
        },
        {
                "v" : 1,
                "key" : {
                        "uid" : 1,
                        "stmp" : -1
                },
                "ns" : "jiunile_login.jiunile_events",
                "name" : "uid_1_stmp_-1"
        }
]

此实例中有三个索引,其中_id是创建表的时候自动创建的索引,不能删除。uid_1_stmp_-1是组合索引。1表示升序,-1表示降序。

2. 创建索引 索引参数有:

option			values				default
backgroud		true/false			false
dropDups		true/false			false
unique			true/false			false
sparse			true/false			false

常规索引创建

> db.jiunile_posts.ensureIndex({pid:1});

当有大量数据时,创建索引会非常耗时,可以指定到后台执行,只需指定“backgroud:true”即可。如

> db.jiunile_posts.ensureIndex({pid:1},{backgroud:true});

3. 嵌入式索引 为内嵌文档的键创建索引与普通的键创建索引并无差异。

> db.jiunile_posts.ensureIndex({"post.date":1})

4. 文档式索引

> db.jiunile_comments.insert({cid:222, properties:{user:'jiunile', email:'jiunile@jiunile.com'}})
> db.jiunile_comments.ensureIndex({properties:1})

5. 组合索引

> db.jiunile_comments.ensureIndex({"properties.user":1,"properties.email":1})

以下的查询将使用到此索引

> db.jiunile_comments.find({"properties.user":'jiunile',"properties.email":'jiunile@jiunile.com'})
> db.jiunile_comments.find({"properties.user":'jiunile'})
> db.jiunile_comments.find().sort({"properties.user":1})

对多个值进行组合索引,查询时,子查询与索引前缀匹配时,才可以使用该组合索引。

6. 唯一索引 只需要在ensureIndex命名中指定"unique:true"即可。

> db.jiunile_posts.ensureIndex({pid:1},{unique:true})

当为已有的集合创建索引,可能有些数据已经有重复了的,那么创建唯一索引将失败。可以使用dropDups来保留第一个文档,而后的重复文档将删除,这种方法慎重操作。

> db.jiunile_posts.ensureIndex({pid:1},{unique:true, dropDups:true})

7. 强制索引 hint命令可以强制使用某个索引

> db.jiunile_posts.find({pid:{$lt:333}}).hint({pid:1,date:1})

8. 删除索引 删除集合所有索引:

> db.collection.dropIndexes()

删除集合某个索引:

> db.collection.dropIndex({x:1})

9. 重建索引

> db.collection.reIndex()
> db.runCommand({reIndex:'collection'})

重建索引会锁住集合的。用repair命令修复数据库时,会重建索引的。

高端时尚购物网店
高端时尚购物网店

1、系统基于网上流行被广泛使用的商城平台延续开发,集百家之所长,技术领先、功能完备;不需要懂技术,只要会打字3分钟即可以建立一个功能完备的网上商城; 2、安装方便:只需传到您的虚拟空间即可; 3、界面由专业设计师设计,时尚简约,采用人性化的布局,是一套纯专业高端网上购物平台。应用本系统更能有效地提高产品档次,树立网店及商品品牌! 4、全面优化代码提供系统的执行效率,并且针对搜索引擎做了代码优化,使

下载

10. 全文索引 mongodb全文索引是在2.4版本引入的,后面再说这个。

11. explain执行计划 使用explain命令返回查询使用的索引情况,耗时,扫描文档数等等统计信息。

> db.jiunile_events.find({uid:178620830}).explain()
{
        "cursor" : "BtreeCursor uid_1_stmp_-1",
        "isMultiKey" : false,
        "n" : 2,
        "nscannedObjects" : 2,
        "nscanned" : 2,
        "nscannedObjectsAllPlans" : 2,
        "nscannedAllPlans" : 2,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 4,
        "indexBounds" : {
                "uid" : [
                        [
                                178620830,
                                178620830
                        ]
                ],
                "stmp" : [
                        [
                                {
                                        "$maxElement" : 1
                                },
                                {
                                        "$minElement" : 1
                                }
                        ]
                ]
        },
        "server" : "jiunile-191155:27017"
}

字段说明:

cursor:返回游标类型
isMultiKey:是否使用组合索引
n:返回文档数量
nscannedObjects:被扫描的文档数量
nscanned:被检查的文档或索引条目数量
scanAndOrder:是否在内存中排序
indexOnly:
nYields:该查询为了等待写操作执行等待的读锁的次数
nChunkSkips:
millis:耗时(毫秒)
indexBounds:所使用的索引
server: 服务器主机名

12. 开启profiling功能 查看profiling级别:

> db.getProfilingLevel()
0

设置profiling级别:

> db.setProfilingLevel( level , slowms )
> db.setProfilingLevel(2,10)
{ "was" : 0, "slowms" : 100, "ok" : 1 }

profile的级别可以取0,1,2 表示的意义如下:

0 – 不开启 默认级别

1 – 记录慢命令 (默认为>100ms)

2 – 记录所有命令

13. 查询profiling记录 MongoDB Profile 记录是直接存在系统 db 里的,记录位置system.profile 。

> db.system.profile.find().sort({$natural:-1}).limit(1)
{ "ts" : ISODate("2013-07-18T09:56:59.546Z"), "op" : "query", "ns" : "jiunile_event.jiunile_events", "query" : { "$query" : { "uid" : 161484152, "stmp" : { "$gt" : 0 } }, "$orderby" : { "stmp" : -1 } }, "ntoreturn" : 0, "ntoskip" : 0, "nscanned" : 35, "keyUpdates" : 0, "numYield" : 0, "lockStats" : { "timeLockedMicros" : { "r" : NumberLong(354), "w" : NumberLong(0) }, "timeAcquiringMicros" : { "r" : NumberLong(3), "w" : NumberLong(3) } }, "nreturned" : 35, "responseLength" : 7227, "millis" : 0, "client" : "10.1.242.209", "user" : "" }
> db.system.profile.find().pretty().limit(1)
{
        "ts" : ISODate("2013-07-18T09:53:40.103Z"),
        "op" : "query",
        "ns" : "jiunile_event.jiunile_event_friends",
        "query" : {
                "_id" : 195794232
        },
        "ntoreturn" : 1,
        "idhack" : true,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(45),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(3),
                        "w" : NumberLong(5)
                }
        },
        "responseLength" : 20,
        "millis" : 0,
        "client" : "10.1.22.199",
        "user" : ""
}

字段说明:

ts: 该命令在何时执行
op: 操作类型
query: 本命令的详细信息
responseLength: 返回结果集的大小
ntoreturn: 本次查询实际返回的结果集
millis: 该命令执行耗时,以毫秒记

14. 修改profiling大小 capped Collections 比普通Collections 的读写效率高。Capped Collections 是高效率的Collection类型,它有如下特点:

a. 固定大小;Capped Collections 必须事先创建,并设置大小:

> db.createCollection("collection", {capped:true, size:100000}) 

b. Capped Collections 可以insert 和update 操作,不能delete 操作。只能用drop()方法删除整个Collection。

c. 默认基于Insert 的次序排序的。如果查询时没有排序,则总是按照insert 的顺序返回。

d. FIFO。如果超过了Collection 的限定大小,则用FIFO 算法,新记录将替代最先insert的记录

> db.setProfilingLevel(0)
{ "was" : 2, "slowms" : 10, "ok" : 1 }
>
> db.getProfilingLevel()
0
> db.system.profile.drop()
true
> db.createCollection("system.profile",{capped:true, size: 1000000})
{ "ok" : 1 }
> db.system.profile.stats()
{
        "ns" : "jiunile_event.system.profile",
        "count" : 0,
        "size" : 0,
        "storageSize" : 1003520,
        "numExtents" : 1,
        "nindexes" : 0,
        "lastExtentSize" : 1003520,
        "paddingFactor" : 1,
        "systemFlags" : 0,
        "userFlags" : 0,
        "totalIndexSize" : 0,
        "indexSizes" : {
        },
        "capped" : true,
        "max" : 2147483647,
        "ok" : 1
}

来源:http://www.ttlsa.com/html/1661.html

mongodb索引使用以及使用explain与profile调优 索引是用来加快查询速度的,事物都有双面性的,同时在每次插入、更新和删除操作时都会产生额外的开销。索引有时并不能解决查询慢的问题,一般来说,返回集合中一半以上的结果,全表扫描要比查询索引更高效些。 创建太多索引,会导致插入非常慢,同时还会占用很大空间。可以通过explain和hint工具来分析。 索引有方向的,倒序还是升序。 每个集合默认的最大索引个数为64个。 1. 查看索引 此实例中有三个索引,其中_id是创建表的时候自动创建的索引,不能删除。uid_1_stmp_-1是组合索引。1表示升序,-1表示降序。 2. 创建索引 索引参数有: 常规索引创建 当有大量数据时,创建索引会非常耗时,可以指定到后台执行,只需指定“backgroud:true”即可。如 3. 嵌入式索引 为内嵌文档的键创建索引与普通的键创建索引并无差异。 4. 文档式索引 5. 组合索引 以下的查询将使用到此索引 对多个值进行组合索引,查询时,子查询与索引前缀匹配时,才可以使用该组合索引。 6. 唯一索引 只需要在ensureIndex命名中指定"unique:true"即可。 当为已有的集合创建索引,可能有些数据已经有重复了的,那么创建唯一索引将失败。可以使用dropDups来保留第一个文档,而后的重复文档将删除,这种方法慎重操作。 7. 强制索引 hint命令可以强制使用某个索引 8. 删除索引 删除集合所有索引: 删除集合某个索引: 9. 重建索引 重建索引会锁住集合的。用repair命令修复数据库时,会重建索引的。 10. 全文索引 mongodb全文索引是在2.4版本引入的,后面再说这个。 11. explain执行计划 使用explain命令返回查询使用的索引情况,耗时,扫描文档数等等统计信息。 字段说明: 12. 开启profiling功能 查看profiling级别: 设置profiling级别: profile的级别可以取0,1,2 表示的意义如下: 0 – 不开启 默认级别 1 – 记录慢命令 [...]mongodb索引使用以及使用explain与profile调优

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 1.6万人学习

黑马云课堂mongodb实操视频教程
黑马云课堂mongodb实操视频教程

共11课时 | 3.1万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 23万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号