mongodb的find查询10万条以上的数据有卡顿现象,请问如何选择优化的方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb的find查询10万条以上的数据有卡顿现象,请问如何选择优化的方式相关的知识,希望对你有一定的参考价值。

当查询数据达到20万条的时候,本机测试需要半分钟以上。我根据查询条件建立索引再测试也没快多少。希望有经验前辈指点一下,谢谢!

参考技术A 你需要有一个字段标示写入数据库的时间,然后查询的时候,设定查询时间段: db.things.find() // 大于某个时间 db.things.find() // 小于某个时间 db.thing...4545追问

这个数据是已经过滤过的,查出1年中每个月的数据,然后做一些数据统计,返回给前端以曲线图显示的。

本回答被提问者采纳

Mongodb的索引操作

1. 为什么mongdb需要创建索引

  • 加快查询速度
  • 进行数据的去重

2. mongodb创建简单的索引方法

语法:db.集合名.ensureIndex({属性:1}),1表示升序, -1表示降序

3. 创建索引前后查询速度对比

测试:插入10万条数据到数据库中

for(i=0;i<100000;i++){db.t1.insert({name:\'test\'+i,age:i})}

创建索引前:

db.t1.find({name:\'test10000\'})
db.t1.find({name:\'test10000\'}).explain(\'executionStats\') # 显示查询操作的详细信息

创建索引:

db.t1.ensureIndex({name:1})

创建索引后:

db.t1.find({name:\'test10000\'}).explain(\'executionStats\')

前后速度对比
image

4. 索引的查看

默认情况下_id是集合的索引
查看方式:db.集合名.getIndexes()

5. 删除索引

语法:db.集合名.dropIndex({\'索引名称\':1})

db.t1.dropIndex({name:1})
db.t1.getIndexes()

6. mongodb创建唯一索引

在默认情况下mongdb的索引域的值是可以相同的,创建唯一索引之后,数据库会在插入数据的时候检查创建索引域的值是否存在,如果存在则不会插入该条数据,但是创建索引仅仅能够提高查询速度,同时降低数据库的插入速度。

6.1 添加唯一索引的语法

db.集合名.ensureIndex({"字段名":1}, {"unique":true})

6.2 利用唯一索引进行数据去重

根据唯一索引指定的字段的值,如果相同,则无法插入数据

db.t1.ensureIndex({"name":1}, {"unique":true})
db.t1.insert({name: \'test10000\'})

7. 建立复合索引

在进行数据去重的时候,可能用一个域来保证数据的唯一性,这个时候可以考虑建立复合索引来实现。

例如:抓全贴吧信息,如果把帖子的名字作为唯一索引对数据进行去重是不可取的,因为可能有很多帖子名字相同

建立复合索引的语法:db.collection_name.ensureIndex({字段1:1,字段2:1})

8. 建立索引注意点

  • 根据需要选择是否需要建立唯一索引

  • 索引字段是升序还是降序在单个索引的情况下不影响查询效率,但是带复合索引的条件下会有影响

  • 数据量巨大并且数据库的读出操作非常频繁的时候才需要创建索引,如果写入操作非常频繁,创建索引会影响写入速度

  • 例如:在进行查询的时候如果字段1需要升序的方式排序输出,字段2需要降序的方式排序输出,那么此时复合索引的建立需要把字段1设置为1,字段2设置为-1

以上是关于mongodb的find查询10万条以上的数据有卡顿现象,请问如何选择优化的方式的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 2.2索引

mongodb查找所有最多

MongoDB 创建索引及其他

MongoDB 查询或编程解决方案

mongodb怎么查询一天中24个小时内的各个数据集合

如何使MongoDB更新执行得更快?