【MongoDB学习笔记20】MongoDB的索引
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,MongoDB的索引和关系型数据库的索引概念和功能是相同的:(1)不使用索引的搜索可以称为全表扫面,也就是说,服务器必须找完整个表才能查询整个结果;(2)建立索引后搜索,查询在索引中搜索,在索引的条目
千家信息网最后更新 2025年01月22日【MongoDB学习笔记20】MongoDB的索引
MongoDB的索引和关系型数据库的索引概念和功能是相同的:
(1)不使用索引的搜索可以称为全表扫面,也就是说,服务器必须找完整个表才能查询整个结果;
(2)建立索引后搜索,查询在索引中搜索,在索引的条目中找到条目以后,就可以直接跳转到目标文档的位置;这样的搜索比全表的搜索的速度要提高好几个数量级;
先向集合blog中添加1000000个文档:
> for (i=0;i<1000000;i++){ ... db.users.insert( ... {"i":i, ... "username":"user"+1, ... "age":Math.floor(Math.random()*120), ... "created":new Date()});} WriteResult({ "nInserted" : 1 }) >
在上述的集合中随机查询一个文档,使用explain函数来查看搜索过程中的信息:
> db.users.find({"username":"user101"}).explain() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1000000, "nscanned" : 1000000, "nscannedObjectsAllPlans" : 1000000, "nscannedAllPlans" : 1000000, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 7812, "nChunkSkips" : 0, "millis" : 344, "server" : "localhost.localdomain:27017", "filterSet" : false } >
其中millies指明搜索花费的毫秒数为344毫秒;
其中n代表扫描全表后的搜索后的结果数为1,搜索并不知道username为user101的数量到底有几个,为优化查询将查询的结果限制为1个,这样在找到第一个文档后便停止搜索:
> db.users.find({"username":"user101"}).limit(1).explain() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 102, "nscanned" : 102, "nscannedObjectsAllPlans" : 102, "nscannedAllPlans" : 102, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "server" : "localhost.localdomain:27017", "filterSet" : false } >
可以看到millis为0,因为扫描文档的数量极大减少了,查询几乎瞬间完成;
但是这个方法有缺陷,如果找users999999,仍然几乎扫描整个集合。
> db.users.find({"username":"user999999"}).limit(1).explain() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1000000, "nscanned" : 1000000, "nscannedObjectsAllPlans" : 1000000, "nscannedAllPlans" : 1000000, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 7812, "nChunkSkips" : 0, "millis" : 321, "server" : "localhost.localdomain:27017", "filterSet" : false } >
花费几乎和搜索整个集合的的时间millis差不多为321,而且随着文档数量增加,查询花费的时间越长;
在username字段上创建索引:
> db.users.ensureIndex({"username":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } >
再次查询users999999的用户:
> db.users.find({"username":"user999999"}).limit(1).explain() { "cursor" : "BtreeCursor username_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 1, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 85, "indexBounds" : { "username" : [ [ "user999999", "user999999" ] ] }, "server" : "localhost.localdomain:27017", "filterSet" : false } >
花费的时间millis为85,比没有创建索引前的321要少很多;
当然索引会加快查询的速度,但是也有弊端,每次添加、删除、更新一个文档,MongoDB不仅要更新文档,还要更新文档上的索引;
每个集合只能有64个集合,挑选合适的字段建立索引非常重要。
索引
搜索
文档
查询
数量
时间
结果
更新
字段
条目
速度
合适
相同
重要
差不多
个数
也就是
也就是说
代表
位置
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
地想观原文数据库
孤岛惊魂6服务器暂不可用
宝山区信息化软件开发市场价格
北京网络安全测评机构
网络技术发展2021年
软件开发brt是什么意思
网络技术保障职责
网络安全倡议书手抄报
郑州游缘汇网络技术有限公司
凶宅数据库查询
数据库查询一个字段中的值
贵州系统软件开发哪家好
本机模拟服务器
mysql数据库时间加减
网络安全挑战有哪些
宜兴市网络安全知识竞赛
数据指标数据库
软件开发计划都计划哪些内容
恩施软件开发有限公司
软件开发搅拌站系统介绍
恩施放心的软件开发电话
蓝屏网络安全模式
什么是网络安全动画
论文查重完会进入数据库么
北京软件开发价位
银川软件开发定制公司
虚拟机上跑服务器
用友数据库不能改
四川语音网络技术分类资费
google云服务器地址