问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

查询mongodb有哪些存在的索引

发布网友 发布时间:2022-05-05 08:24

我来回答

2个回答

懂视网 时间:2022-05-05 12:45

[摘]MongoDB范围查询的索引优化 我们知道, MongoDB 的 索引 是B-Tree结构的,和MySQL的索引非常类似。所以你应该听过这样的建议: 创建索引的时候要考虑到sort操作,尽量把sort操作要用到的字段放到你的索引后面。 但是有的情况下,这样做反而会使你的查询

[摘]MongoDB范围查询的索引优化

我们知道,MongoDB的索引是B-Tree结构的,香港服务器,和MySQL的索引非常类似。所以你应该听过这样的建议:创建索引的时候要考虑到sort操作,尽量把sort操作要用到的字段放到你的索引后面。但是有的情况下,这样做反而会使你的查询性能更低。

问题

比如我们进行下面这样的查询:

db.collection.find({"country": "A"}).sort({"carsOwned": 1})

查询条件是 {“country”: “A”},按 carsOwned 字段的正序排序。所以索引就很好建了,香港服务器租用,直接建立 country , carsOwned 两个字段的联合索引即可。像这样:

db.collection.ensureIndex({"country": 1, "carsOwned": 1})

我们来看一个稍微复杂一点的查询:

db.collection.find({"country": {"$in": ["A", "G"]}}).sort({"carsOwned": 1})

这回我们是要查询 country 为 A 或者 G 的数据条目,结果同样按 carsOwned 字段排序。

如果我们还使用上面的索引,并且使用 explain() 分析一下这个查询,就会发现在输出中有一个“scanAndOrder” : true 的字段,并且 nscanned 的值可能会比想象中的大很多,甚至指定了 limit 也没什么效果。

原因

这是什么原因呢,服务器空间,我们先看下面这张图:

如上图所未,左边一个是按 {“country”: 1, “carsOwned”: 1} 的顺序建立的索引。而右边是按{“carsOwned”: 1, ”country”: 1} 顺序建立的索引。

如果我们执行上面的查询,通过左边的索引,我们需要将 country 值为A的(左图的左边一支)所有子节点以及country 值为G的(左图的右边一支)所有子节点都取也来。然后再对取出来的这些数据按 carsOwned 值进行一次排序操作。

所以说上面 explain 输出了一个 “scanAndOrder” : true 的提示,就是说这次查询,是先进行了scan获取到数据,再进行了独立的排序操作的。

那如果我们使用右边的索引来做查询,结果就不太一样了。我们没有将排序字段放在最后,而是放在了前面,相反把筛选字段放在了后面。那这样的结果就是:我们会从值为1的节点开始遍历(右图的左边一支),当发现有 country 值为 A 或 G 的,就直接放到结果集中。当完成指定数量(指定 limit 个数)的查找后。我们就可以直接将结果返回了,因为这时候,所有的结果本身就是按 carsOwned 正序排列的。

对于上面的数据集,如果我们需要2条结果。我们通过左图的索引需要扫描到4条记录,然后对4条记录进行排序才能返回结果。而右边只需要我们扫描2条结果就能直接返回了(因为查询的过程就是按需要的顺序去遍历索引的)。

所以,在有范围查询(包括$in, $gt, $lt 等等)的时候,其实刻意在后面追加排序索引通常是没有效果的。因为在进行范围查询的过程中,我们得到的结果集本身并不是按追加的这个字段来排的,还需要进行一次额外的排序才行。而在这种情况下,可能反序建立索引(排序字段在前、范围查询字段在后)反而会是一个比较优的选择。当然,是否更优也和具体的数据集有关。

总结

总结一下,举两个栗子。

当查询是:

db.test.find({a:1,b:2}).sort({c:1})

那么直接建立 {a:1, b:1, c:1} 或者 {b:1, a:1, c:1} 的联合索引即可。

如果查询是:

db.test.find({a:1,b:{$in:[1,2]}}).sort({c:1})

那么可能建立 {a:1, c:1, b:1} 的联合索引会比较合适。当然,这里只是提供了多一种思路,具体是否采用还是需要视你的数据情况而定。

来源:architects.dzone.com

posted on

Copyright ©2012 李少宏

热心网友 时间:2022-05-05 09:53

默认的只有以_id为key的索引,其余的索引需要手动创建。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 蓝牙手电筒音箱普通版,和蓝牙版是什么意思? 迅雷看看十大搞笑电影 十年前我们还是个孩子,十年后看看自己百度的解答,挺好笑! 每年考研*、数学、英语的教材变化大吗?我打算2011年考研究生,现在先看看10年的教材有用吗? 急啊,我是1983年6月23日,我女朋友是1990年3月02日出生,请教高人看看10月适不适合结婚的日子,请高人指 22岁了,还一事无成,我是否很失败? 壬申壬寅壬申壬寅哪位大师帮忙看看十多年了一直不顺提压抑的,请问什么时候会好点 南方500基金定投10年收益如何,我2011年10月开始买的基金。每个月500元。高手看看10年大概的收益会怎样, 音响上的bluetooth是什么 为什么网上的结婚吉日有很多版本。有的还自相矛盾。求原版的老黄历,不要网上的。请看看10,11,12月的结婚 请看看十多年前的笔记本电脑,还可以再抢救一下吗? 我想去看看10字日记 湖人十年后再次杀进总决赛,看看十年前后这两群湖人去哪了? 老哥们来看看十代思域这个价格怎么样 读一读下面这首诗,看看十个“一”的读音依次变成了几声。 [ ] 一篙一橹一渔舟,一个梢 有一首歌歌词是看看十年以后的自己 这是什么歌 鞋这篇短文最后写道:排长迈着大步起了。小鞋匠看看十书军人留鹤鞋会想些什么? 方舟生存进化怎么驯泰坦龙 CAD2007端点或中点的小黄框没了怎么调出来 怎么永久删除xp中的路由 脾气虚不能吃的蔬菜和水果 脾胃虚寒。气血不足的人应该在饮食上注意哪些。哪些能吃。哪些又不能吃。 人教版小学语文六年级上册课文(完整版)[1] 什么人不能吃香菜 微信一天可以向好友推荐多少名片? 气血不足吃什么蔬菜好 微信名片加人每天限制多少 微信别人推了很多名片过来,一天可以加多少名片? 2019秋六年级语文上册第七单元22月光曲教学课件新人教版 白萝卜不能和什么一起吃,白萝卜有哪些有营养价值? 阳虚体质的人,吃什么蔬菜好 什么蔬菜不宜多吃? 网上哪个借钱平台快 4被5除 什么意思? 余数是什么? 44……4÷5(中间有1000个6)余数是多少? 有一个两位数,除以4的数是2,除以5的余数是丨。这个数最小是多少? 苹果笔记本怎样用。wifi连接电视机 一个数除以2 3 4 5所得的余数各不相同,那么这个数可能是几? 一个数除以3除以4除以5所得的余数各不相相同,这个数最小是? 有一个两位数,他分别除以1,2,3,4,5的余数互不相同,这个数最小是多少