热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MongoDB数据库如何优化

优化一个简单的例子这部分主要讲解如何优化MongoDB的性能。让我们举个具体示例。假使我们的任务是现实blog的首页-我们希望现实最近发布的10条posts。ts为时间字段。语句如下articlesdb.posts.find().sort({ts:-1});//getblogpostsinreversetimeorde
优化一个简单的例子

这部分主要讲解如何优化MongoDB的性能。

让我们举个具体示例。假使我们的任务是现实blog的首页-我们希望现实最近发布的10条posts。ts为时间字段。

语句如下

articles = db.posts.find().sort({ts:-1});
// get blog posts in reverse time order
for (var i=0; i< 10; i++)
{   print(articles[i].getSummary());}
优化 #1: 创建索引

第一个优化就是要在ts上创建索引,用来快速排序。

db.posts.ensureIndex({ts:1});

使用索引,数据库就可以基于索引信息排序,不会直接查看每个document。这样做更快。

优化#2: 限定结果

MongoDB游标返回一组document,我们叫这个为chunks。

这chunk可能包含超过10个对象。额外的对象对于我们的需求是浪费,

浪费了网络带宽和应用服务器以及数据库的资源。

我们知道想要结果的个数,那么就不需要所有的结果。我们可以使用limit()方法

articles = db.posts.find().sort({ts:-1}).limit(10);
// 最多10条

现在,我们从客户端返回了10条。

优化 #3: 查询相关的字段

post对象非常大, 如post文本和评论数组。 比较好的方式是只查询我们要用到的字段。

articles = db.posts.find({}, {ts:1,title:1,author:1,abstract:1}).sort({ts:-1}).limit(10);
articles.forEach( function(post) { print(post.getSummary()); } );

上面的getSummary()方法假使是可以获得find()方法返回的字段值

注意,如果你选择了要查询的字段,那么返回的就是部分对象。这个对象并不能直接进行更新。如下

a_post = db.posts.findOne({}, Post.summaryFields);
a_post.x = 3;
db.posts.save(a_post); // 错误,抛出异常
使用 Profiler

MongoDB有一个数据库的 profiler,用来显示每个操作的性能。

使用profiler你可以查看到哪些查询或者写入的速度比较慢。

举个例子,使用这些信息可以知道什么时候需要索引。详情查看 Database Profiler 。

 Use count()优化语句

加速语句速度依赖于count(),创建一个索引,调用count()。

db.posts.ensureIndex({author:1});
db.posts.find({author:"george"}).count();
增量操作Increment Operations

MongoDB 支持简单对象字段的增量操作; 

基本上来说, 这个操作就是 在服务器document中增量一个字段"。

这个要比"获取一个document,更新这个字段并且在保存会服务器"这个方法快很多,

并且对于实时的计数器更为有用。详情请看  Updates 。

固定大小的collection。

MongoDB提供了一个特殊的collection,它提前分配好了存储空间。

保存的项都是固定顺序的,并且没有索引。而且写入和读取是非常高速的。

存储是为了保存日志文件所设置的。详情查看 Capped Collections 

服务端代码执行Server Side Code Execution

也许有的时候为了高性能,避免客户端和服务端来回通信,需要直接在服务端执行代码。

这部分查看 Server-Side Processing 。

Explain工具

要想查看查询语句的详细性能信息,最好的方法就是使用explain方法。

返回的结果就是整个查询执行的一些信息。

当使用shell的时候,可以调用cursor的explain() 方法。

db.collection.find(query).explain();

返回的信息如下

{"cursor" : "BasicCursor",
"indexBounds" : [ ],
"nscanned" : 57594,
"nscannedObjects" : 57594,
"nYields" : 2 ,
"n" : 3 ,
"millis" : 108,
"indexOnly" : false}

现实结果可以得知cursor的类型,DB扫描的数据数,返回的数据数,还有执行的毫秒数。

nscanned - 扫描的数据条数。这个数据可能是对象也可能是索引的键。

如果"覆盖索引(covered index)"被调用了,nscanned 要高于nscannedObjects.

nscannedObjects - 扫描对象的数。

nYields - 查询所产生的锁的个数。

indexOnly - 是否使用了covered index。

Hint

虽然MongoDB查询优化器一般工作的很不错,但是也可以使用hints来强迫MongoDB使用一个指定的索引。

这种方法某些情形下会提升性能。 一个有索引的collection并且执行一个多字段的查询(一些字段已经索引了)。

传入一个指定的索引,强迫查询进行使用。

db.collection.find({user:u, foo:d}).hint({user:1});
确定创建了索引。
上面的例子,首先你确定索引已经创建了。请使用ensureIndex()创建索引。

其他的例子,有个在 {a:1, b:1} 上的索引,名称为"a_1_b_1":

db.collection.find({a:4,b:5,c:6}).hint({a:1,b:1});
db.collection.find({a:4,b:5,c:6}).hint("a_1_b_1");

强迫查询不适用索引, (做一个表的扫描), 使用:

> db.collection.find().hint({$natural:1})

推荐阅读
  • 本文讨论了一种特定的查询需求,即在提到某一品牌时同时查询到哪些其他品牌,并分析了不同数据库对这种需求的支持情况。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
  • 如何高效分割180万条MongoDB数据以提升性能和可管理性? ... [详细]
  • MongoDB核心概念与基础知识解析
    MongoDB 是一种基于分布式文件存储的非关系型数据库系统,主要采用 C++ 语言开发。本文将详细介绍 MongoDB 的核心概念和基础知识,包括其与传统 SQL 数据库的区别,数据库及集合的基本操作,如数据的插入、更新、删除和查询等。通过本文,读者可以全面了解 MongoDB 的基本功能及其应用场景。 ... [详细]
  • MongoVUE基础操作指南:轻松上手数据库管理
    本文介绍了MongoVUE的基础操作,旨在帮助用户轻松掌握数据库管理技巧。MongoVUE是一款功能强大的MongoDB客户端工具,虽然需要注册,但其用户友好的界面和丰富的功能使其成为许多开发者的首选。文中详细解释了安装步骤、基本配置以及常见操作方法,并对一些常见的问题进行了修正和补充,确保用户能够快速上手并高效使用MongoVUE进行数据库管理。 ... [详细]
  • MongoDB 默认使用哪个端口?—— MongoDB 教程详解
    MongoDB 在默认配置下监听的端口是 27017,用户在连接数据库时通常会使用此端口进行各种操作,包括数据插入、查询和更新等。除了 27017 端口外,MongoDB 还支持其他配置选项,以满足不同的应用场景和安全需求。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
author-avatar
金berends_941
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有