MongoDB 性能优化


MongoDB 性能优化 查询操作的优化 假设我们按照时间戳查询最近发表的 10 篇博客文章: 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: 创建索引 在查询条件的字段上,或者排序条件的字段上创建索引,可以显著提高执行效率: db.posts.ensureIndex({ts:1}); 优化#2: 限定返回结果条数 使用 limit()限定返回结果集的大小,可以减少 database server 的资源消耗,可以减少网络传输 数据量。 articles = db.posts.find().sort({ts:-1}).limit(10); // 10 results maximum 优化#3: 只查询使用到的字段,而不查询所有字段 The blog post object may be very large, with the post text and comments embedded. Much better performance will be achieved by selecting only the fields we need: 在本例中,博客日志记录内容可能非常大,而且还包括了评论内容(作为 embeded 文档)。所 以只查询使用的字段,比查询所有字段效率更高: articles = db.posts.find({}, {ts:1,title:1,author:1,abstract:1}).sort({ts:-1}).limit(10); 注意:如果只查询部分字段的话,不能用返回的对象直接更新数据库。下面的代码是错误的: a_post = db.posts.findOne({}, Post.summaryFields); a_post.x = 3; db.posts.save(a_post); // error, exception thrown Using the Profiler MongoDB 有一个数据库优化工具 Database Profiler,这个工具能检测数据库操作的性能。用个 工具可以发现 query 或者 write 操作中执行效率低的,从而针对这些操作进行优化。 优化 count()查询操作 在 count()操作的查询条件字段上创建索引,可以提高效率。 db.posts.ensureIndex({author:1}); db.posts.find({author:"george"}).count(); Increment 操作 更新字段的值时,使用 Increment 操作效率更高。Increment 操作比先查询出数据,然后修改数 据执行 update 操作的效率更高。 Circular Fixed Size Collections apped Collections 比普通 Collections 的读写效率高。Capped Collections 是高效率的 Collection 类型,它有如下特点:  固定大小;Capped Collections 必须事先创建,并设置大小: db.createCollection("mycoll", {capped:true, size:100000})  Capped Collections 可以 insert 和 update 操作;不能 delete 操作。只能用 drop() 方法删除整个 Collection。  默认基于 Insert 的次序排序的。如果查询时没有排序,则总是按照 insert 的顺序返回。  FIFO。如果超过了 Collection 的限定大小,则用 FIFO 算法,新记录将替代最先 insert 的记录。 Server Side Code Execution Server-Side Processing 类似于 SQL 数据库的存储过程,使用 Server-Side Processing 可以减 小网络通讯的开销。 Explain 使用 explain,MongoDB 显示操作的 explain plan。可以根据 explain plan 进行优化。 db.collection.find(query).explain(); provides information such as the following: { "cursor" : "BasicCursor", "indexBounds" : [ ], "nscanned" : 57594, "nscannedObjects" : 57594, "n" : 3 , "millis" : 108 } Cursor:BasicCursor 表示没有用到索引(类似 SQL 数据库的全部扫描。) BtreeCursor 表示使用了索引。 indexBounds:使用到的索引; nscanned:扫描的总记录数; nscannedObjects:扫描的总对象数; n:命中的总记录数; millis:执行的时间长度。 This will tell you the type of cursor used (BtreeCursor is another type – which will include a lower & upper bound), the number of records the DB had to examine as part of this query, the number of records returned by the query, and the time in milliseconds the query took to execute. Hint 一般情况下 Mongo query optimizer 都工作良好,但有些情况下使用 hint()可以提高操作效率。 Hint 可以强制要求查询操作使用某个索引。例如,如果要查询多个字段的值,如果在其中一个字 段上有索引,可以使用 hint: db.collection.find({user:u, foo:d}).hint({user:1}); Optimizing Object IDs The _id field in MongoDB objects is very important and is always indexed. This page lists some recommendations. Use the collections 'natural primary key' in the _id field. 如果有自己的主键列,则使用自己的主键列作为 ID。这样可以节约空间,也不需要创建额外的 索引。 Use _id values that are roughly in ascending order. _ID 列(主键列)如果按照大小顺序生成,则可以提高效率(MongoDB 内部插入 b-tree 时速度 更快) Store GUIDs as BinData, rather than as strings 如果是 UUID 类型的主键,使用 BinaryData 比使用 String 存储效率高。
还剩3页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 4 人已下载

下载pdf

pdf贡献者

xtjsxtj

贡献于2012-03-30

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf