首页 > 编程知识 正文

MongoDB 索引和复合索引以及全文索引九,复合索引abc

时间:2023-05-04 00:23:41 阅读:182332 作者:3005

集合中已经有200万条数据,可以对索引进行操作。 首先创建索引,然后看看查询的性能提高了多少。 这不是什么难事。 主要是掌握索引的制作方法就可以了。

普通查询性能

首先做一个普通的查询,随便找个用户名,计算查询和打印的时间。 因为有200万件数据,所以性能不是很高。

varstarttime=newdate(.gettime ) /程序开始运行的时间vardb=connect ) ' company链接数据库varRS=db.randominfo.find ) ) //程序的运行时间print ([ success ] thisruntimeis : ' runtime ' ms ' ) ) )打印运行时间上面的代码是一种普通的查询,只是记录了时间。 启动终端后,运行时间约为0.8秒左右,初次无现金的运行时间约为3.5秒左右。 这个时间不能满足我们的日常咨询。

建立索引

尝试为用户名(username )创建索引。 编制索引用一句话就可以了。

db.random info.ensure index ({ username :1 } )显示现有索引

db.randomInfo.getIndexes ()终端的结果目前只有一个索引值:

[ { 'v' : 2,' key' : { '_id' : 1 },' name' : '_id_ ', “ns' : 'company.randomInfo' }]”使用命令创建索引db.random info.ensure index ({ uer name :1 } ),创建后约为50个索引

结果如下。 变成了两个索引。

[ { 'v' : 2,' key ' : { ' _ id ' : ' _ id _,' name ' : ' company.random info ' } ' ] ' name' : 'uername_1',' ns' : 'company.randomInfo' }]然后我们来到load。此时查询时间缩短到4ms左右,查询性能提高了约200倍左右

总结:无论是在关系数据库还是文档数据库中,建立索引都是非常重要的。 如前所述,索引消耗硬盘和内存资源,仍须根据程序需要编制。 MongoDB也限制了只能创建64个索引值。

复合索引索引中的小坑

我记得刚学习MongoDB的时候,记住了索引。 我想到处使用,就连几百个数据集合(collections ),我都试着聪明地使用,但最终还是画蛇添足,走了弯路。 通过实际开发和性能比较,我自己总结了几种不使用索引的情况(虽然不一定正确,但我的经验之谈)。

如果数据不超过万条,则不需要使用索引。 性能提升不明显,内存和硬盘消耗大幅增加。 如果查询数据超过表数据量的30%,请不要使用索引字段查询。 实际证明比不使用索引要慢。 因为我搜索了大量的索引表和我们原来的表。 数字索引比字符串索引快得多,且在百万或千万级别的数据量之前,使用数字索引是一个明确的选择。 把你经常查的数据变成在线数据(对象类型的数据),汇总成索引。复合索引

好了,我们谈了很多理论,现在我们来看看复合索引。 复合索引是两个或多个索引。 在上一课中,您在username字段中创建了索引。 在此,randNum0,也在该字段中设定索引。

db.random info.ensure index (randnum 0:1 ) )然后使用索引状态命令进行查询。

/p> db.randomInfo.getIndexes()

这时候已经是两个自建索引了,一共有三个索引。

[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "company.randomInfo" }, { "v" : 2, "key" : { "username" : 1 }, "name" : "username_1", "ns" : "company.randomInfo" }, { "v" : 2, "key" : { "randNum0" : 1 }, "name" : "randNum0_1", "ns" : "company.randomInfo" }]

两个索引同时查询

我们同时查询两个索引的值,看看效果是怎么样的。

var startTime=new Date().getTime();var db = connect('company');var rs= db.randomInfo.find({username:'7xwb8y3',randNum0:565509});rs.forEach(rs=>{printjson(rs)});var runTime = new Date().getTime()-startTime;print('[Demo]this run time is '+runTime+'ms');

从性能上看并没有什么特殊的变化,查询时间还是在4ms左右。MongoDB的复合查询是按照我们的索引顺序进行查询的。就是我们用db.randomInfo.getIndexes()查询出的数组。

指定索引查询(hint)

数字的索引要比字符串的索引快,这就需要一个方法来打破索引表的查询顺序,用我们自己指定的索引优先查询,这个方法就是hint().

var rs= db.randomInfo.find({username:'7xwb8y3',randNum0:565509}).hint({randNum0:1});

删除索引

当索引性能不佳或起不到作用时,我们需要删除索引,删除索引的命令是dropIndex().

db.randomInfo.dropIndex('randNum0_1');//索引的唯一ID

这里需要注意的是删除时填写的值,并不是我们的字段名称(key),而是我们索引查询表中的name值。这是一个小坑,希望小伙伴们不要踩中。

全文索引

准备工作:

这节我们先建立一个集合(collections)-info,然后插入一小段文章,作用就是为建立全文索引提供数据,当然我们不再建立百万级数据,我们只是看一下效果。

db.info.insert({contextInfo:"I am a programmer, I love life, love family. Every day after work, I write a diary."})db.info.insert({contextInfo:"I am a programmer, I love PlayGame, love drink. Every day after work, I playGame and drink."}

当然这很简单,再次强调这只是文章需要,实际工作中这么简单的数据没必要建立全文索引。

建立全文索引

db.info.ensureIndex({contextInfo:'text'})

需要注意的是这里使用text关键词来代表全文索引,我们在这里就不建立数据模型了。

全文索引查找 建立好了全文索引就可以查找了,查找时需要两个关键修饰符:

$text:表示要在全文索引中查东西。$search:后边跟查找的内容。

db.info.find({$text:{$search:"programmer"}})

查找多个词

全文索引是支持多个次查找的,比如我们希望查找数据中有programmer,family,diary,drink的数据(这是或的关系),所以两条数据都会出现。

db.info.find({$text:{$search:"programmer family diary drink"}})

如果我们这时候希望不查找出来有drink这个单词的记录,我们可以使用“-”减号来取消。

dbd .info.find({$text:{$search:"programmer family diary -drink"}})

转义符:

全文搜索中是支持转义符的,比如我们想搜索的是两个词(love PlayGame和drink),这时候需要使用斜杠来转意。

db.info.find({$text:{$search:""love PlayGame" drink"}})

全文索引在工作还是经常使用的,比如博客文章的搜索,长文件的关键词搜索,这些都需要使用全文索引来进行。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。