位置: 编程技术 - 正文

MongoDB索引使用详解(mongodb索引使用正则表达式)

编辑:rootadmin

推荐整理分享MongoDB索引使用详解(mongodb索引使用正则表达式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mongodb建立索引的命令,mongodb索引存储方式,mongodb索引用什么数据结构,mongodb索引用什么数据结构,mongodb sort 索引,mongodb索引的功能,mongodb索引的功能,mongodb索引用什么数据结构,内容如对您有帮助,希望把文章链接给更多的朋友!

索引就像书的目录,如果查找某内容在没有目录的帮助下,只能全篇查找翻阅,这导致效率非常的低下;如果在借助目录情况下,就能很快的定位具体内容所在区域,效率会直线提高。

索引简介

首先打开命令行,输入mongo。默认mongodb会连接名为test的数据库。

可以使用show collections/tables查看数据库为空。

然后在mongodb命令行终端执行如下代码

再查看数据库发现多了system.indexes 和 users两个表,前者即所谓的索引,后者为新建的数据库表。这样user表中即有了万条数据。

现在需要查找其中任意一条数据,比如

发现这条数据成功找到,但需要了解详细信息,需要加上explain方法

参数很多,目前我们只关注其中的"nscanned" : 和"millis" : 这两项。

nscanned表示mongodb在完成这个查询过程中扫描的文档总数。可以发现,集合中的每个文档都被扫描了,并且总时间为毫秒。

如果数据有万个,如果每次查询文档都遍历一遍。呃,时间也是相当可观。

对于此类查询,索引是一个非常好的解决方案。

然后再查找user

的确有点不可思议,查询在瞬间完成,因为通过索引只查找了一条数据,而不是条。

当然使用索引是也是有代价的:对于添加的每一条索引,每次写操作(插入、更新、删除)都将耗费更多的时间。这是因为,当数据发生变化时,不仅要更新文档,还要更新级集合上的所有索引。因此,mongodb限制每个集合最多有个索引。通常,在一个特定的集合上,不应该拥有两个以上的索引。

小技巧

如果一个非常通用的查询,或者这个查询造成了性能瓶颈,那么在某字段(比如username)建立索引是非常好的选择。但只是给管理员用的查询(不太在意查询耗费时间),就不该对这个字段建立索引。

复合索引

索引的值是按一定顺序排列的,所以使用索引键对文档进行排序非常快。

这里先根据age排序再根据username排序,所以username在这里发挥的作用并不大。为了优化这个排序,可能需要在age和username上建立索引。

db.users.ensureIndex({'age':1, 'username': 1})这就建立了一个复合索引(建立在多个字段上的索引),如果查询条件包括多个键,这个索引就非常有用。

建立复合索引后,每个索引条目都包括一个age字段和一个username字段,并且指向文档在磁盘上的存储位置。此时,age字段是严格升序排列的,如果age相等时再按照username升序排列。

查询方式

点查询(point query)

用于查询单个值(尽管包含这个值的文档可能有多个)

因为我们已经建立好复合索引,一个age一个username,建立索引时使用的是升序排序(即数字1),当使用点查询查找{age:},假设仍然是万条数据,可能年龄是的很多人,因此会找到不只一条数据。然后sort({'username': -1})会对这些数据进行逆序排序,本意是这样。但我们不要忘记建立索引时'username':1是升序(从小到大),如果想得到逆序只要对数据从最后一个索引开始,依次遍历即可得到想要的结果。

MongoDB索引使用详解(mongodb索引使用正则表达式)

排序方向并不重要,mongodb可以从任意方向对索引进行遍历。综上,复合索引在点查询这种情况非常高效,直接定位年龄,不需要对结果进行排序,返回结果。

多值查询(multi-value-query)

查找多个值相匹配的文档。多值查询也可以理解为多个点查询。如上,要查找年龄介于到之间。monogdb会使用索引的中的第一个键"age"得到匹配的结果,而结果通常是按照索引顺序排列的。

与上一个类似,这次需要对结果排序。在没有sort时,我们查询的结果首先是根据age等于,age等于..这样从小到大排序,当age等于有多个时,在进行usernameA-Z(0-9)这样排序。所以,sort({'username': 1}),要将所有结果通过名字升序排列,这次不得不先在内存中进行排序,然后返回。效率不如上一个高。

当然,在文档非常少的情况,排序也花费不了多少时间。如果结果集很大,比如超过MB,MongoDB会拒绝对如此多的数据进行排序工作。

还有另外一种解决方案

也可以建立另外一个索引{'username': 1, 'age': 1}, 如果先对username建立索引,当再sortusername,相当没有进行排序。但是需要在整个文档查找age等于的帅哥美女,所以搜寻时间就长了。

但哪个效率更高呢?

如果建立多个索引,如何选择使用哪个呢?效率高低是分情况的,如果在没有限制的情况下,不用进行排序但需要搜索整个集合时间会远超过前者。但是在返回部分数据(比如limit()),新的赢家就产生了。

其中可以使用hint指定要使用的索引。所以这种方式还是很有优势的。比如一般场景下,我们不会把所有的数据都取出来,只是去查询最近的,所以这种效率也会更高。

索引类型

唯一索引

可以确保集合的每个文档的指定键都有唯一值。

db.users.ensureIndex({'username': 1, unique: true})比如使用mongoose框架,在定义schema时,即可指定unique: true.如果插入2个相同都叫张三的数据,第二次插入的则会失败。_id即为唯一索引,并且不能删除。

稀疏索引

使用sparse可以创建稀疏索引

>db.users.ensureIndex({'email': 1}, {'unique': true, 'sparse': true})

索引管理

system.indexes集合中包含了每个索引的详细信息

db.system.indexes.find()

1.ensureIndex()创建索引

db.users.ensureIndex({'username': 1})后台创建索引,这样数据库再创建索引的同时,仍然能够处理读写请求,可以指定background选项。

db.test.ensureIndex({"username":1},{"background":true})

2.getIndexes()查看索引

其中v字段只在内部使用,用于标识索引版本。

3.dropIndex删除索引

全选复制放进笔记> db.users.dropIndex({"username":1})

使用aggregate在MongoDB中查询重复数据记录的方法 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的count(*)。aggregate()方法MongoDB中聚合的方

mongodb使用心得简单总结 1.mongodb特性1)mongo是一个面向文档的数据库,它集合了nosql和sql数据库两方面的特性。2)所有实体都是在首次使用时创建。3)没有严格的事务特性,但

在Mac OS上安装使用MongoDB的教程 概念MongoDB是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便。MongoDB工作在收集和文件的概念。什么是NoSql?NoSql,全称是NotOn

标签: mongodb索引使用正则表达式

本文链接地址:https://www.jiuchutong.com/biancheng/312101.html 转载请保留说明!

上一篇:Mongodb 删除添加分片与非分片表维护(mongodb如何删除)

下一篇:mongodb使用心得简单总结(mongodb使用案例)

  • 税控盘抵扣税款
  • 暂时进出境货物和暂准进出境货物
  • 企业所得税应纳税额
  • 进口环节应纳消费税的计税依据为
  • 收到税务局退款怎么做分录
  • 个人所得税申报是公司申报还是个人申报
  • 采购的货物没有及时到怎么办
  • 应交税费进项税额属于什么科目借贷方向
  • 企业所得税不含税价格怎么算
  • 股东股权转让印花税公司可以报销吗
  • 发票遗失如何报销
  • 非公益捐赠税率
  • 收到费用报销发票怎么做
  • 销售发票红冲会计分录怎么做?
  • 不动产进项税额分两年抵扣
  • 库存现金限额一般由开户银行根据企业
  • 增值税税控系统的税务处理
  • 企业所得税可以选择不弥补亏损吗
  • 增值税检查调整科目已经删除
  • 陈列费发票属于什么类型
  • 旧设备投资的账务处理
  • 差额征税可以开发票吗
  • 专用发票的审核要多久
  • 银行承兑汇票怎么开
  • 汇算清缴税务审计报告
  • 固定资产可以一次折旧完吗
  • 信息化投入包括什么投入和什么投入
  • 如何使用windows的记事本创建文件
  • 个体户流水太大工商局会查吗
  • 房屋出租后土地使用税谁来交
  • 银行账户销户余额转入另外的公司账户分录
  • linux命令行使用鼠标
  • 企业收到政府出资款交增值税
  • 固定资产多少可以费用化
  • 喝薏米红豆水最佳时间
  • php bi
  • 事业单位委托业务费的现金流量
  • php读取xml文件
  • php抽奖程序源码
  • defaultpool
  • 数字图像处理总结
  • vue使用技巧
  • tokenizer.encode、tokenizer.tokenize、tokenizer.encode_plus的用法差异
  • php路径问题
  • 车子以旧换新
  • 增值税在纳税申报表中怎么得出
  • 帝国cms常见的英文
  • phpcms怎么修改模板风格
  • centos安装MySQL数据库
  • 基建期业务招待会议记录
  • 小企业会计准则适用于哪些企业
  • 以旧换新有发票抵扣吗
  • 购买的金税盘可以抵扣吗
  • 电子承兑汇票支付信用查询
  • 全年一次性奖金单独计税还是并入
  • 销售额多少需要纳税
  • 政府对企业提交的项目申请报告主要从等方面进行核准
  • 待报解预算收入什么意思
  • 企业银行贷款报表模板
  • 保证金计算器
  • 在建工程工伤保险延期费用计算
  • 经营利润所得税费用
  • 会计科目漏记怎么补记
  • 应交税费为负数在资产负债表中的列报
  • 增值税的专用发票的相关规定
  • 增资协议书范本合同
  • 子公司的财务管理方法
  • sql报无效字符
  • mysql的随机函数
  • centos访问网页命令
  • rsync如何同步隐藏文件和排除文件?rsync同步隐藏文件和排除文件的方法
  • windows 8.1更新
  • 使用灭火器人要站在上风口还是下风口
  • 主流安卓开发
  • html js怎么调用
  • jQuery 更改checkbox的状态,无效的解决方法
  • 养老待遇核定表在哪办理
  • 中国税务局河北省税务局官网
  • 河北电子税务局开票流程
  • 广东国家税务局网上税务服务大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设