天天看點

昊鼎王五:如何MongoDB查詢優化?

#昊鼎王五:如何MongoDB查詢優化?

MongoDB 查詢優化

#1.在查詢條件、排序條件、統計條件的字段上選擇建立索引,可以顯著提高查詢效率。
比如:建立唯一索引

db.fs.files.ensureIndex({"filename":1},{"unique":true})

#2.用$or時把比對最多結果的條件放在最前面,用$and時把比對最少結果的條件放在最前面。

Criteria().orOperator(Criteria.where("_id").is(newObjectId(projec	tId.toString())

#3.使用limit()限定傳回結果集的大小,減少資料庫伺服器的資源消耗,以及網絡傳輸的資料量。

		query.with(new Sort(new Order(Direction.DESC, "")));
		query.skip((pageable.getPageNumber() - Constants.INT_ONE) * 				pageable.getPageSize());
		query.limit(pageable.getPageSize());
		
#4 盡量少用$in,而是分解成一個一個的單一查詢。尤其是在分片上,
$in會讓你的查詢去每一個分片上查一次,如果實在要用的話,先在每個分片上建索引。

#5. 盡量不用模糊比對查詢,用其它精确比對查詢代替,比如$in、$nin。

db.users.find({'age' : {'$in' : [10, 22, 26]}});

#6. 查詢量大、并發大的情況,通過前端加緩存解決。

#7. 隻查詢要使用的字段,而不查詢所有字段。

 	BasicDBObject key=new BasicDBObject("vid",1);//指定需要顯示列  
 DBCursor cursor=video_info.find(condition,key); 

#8. 更新字段的值時,使用$inc比update效率高。

    new Query(Criteria.where("id").is(id)), new Update().inc("age", 3)  

#9. apped collections比普通collections的讀寫效率高。

#10. 必要時使用hint()強制使用某個索引查詢。

db.COLLECTION_NAME.find({"TIME.registerdate":{$gte:"2014-04-19" }}).hint("TIME.r	egisterdate_1") 
如果有自己的主鍵列,則使用自己的主鍵列作為id,這樣可以節約空間,也不需要建立額外的是以。

#11. 使用explain,根據exlpain plan進行優化。

Mongodb提供了一個explain指令,用來檢視查詢的過程,以便進行性能優化。
    db.users.explain("allPlansExecution").find({username:'user101'})


#12. 範圍查詢的時候盡量用$in、$nin代替,比如查詢id=7,id=8,id=9盡量用$in

 $in 包含
與 sql 标準文法的用途是一樣的,即要查詢的是一系列枚舉值的範圍内
查詢 x 的值在 2,4,6 範圍内的資料
db.things.find({x:{$in: [2,4,6]}});
 $nin 不包含
與 sql 标準文法的用途是一樣的,即要查詢的資料在一系列枚舉值的範圍外
查詢 x 的值在 2,4,6 範圍外的資料
db.things.find({x:{$nin: [2,4,6]}});

#13. 檢視資料庫查詢日志,具體分析的效率低的操作。

#14. mongodb資料庫優化工具database profiler,檢測資料庫操作的性能。可以發現query或者write操作中執行效率低的,進而針對這些操作進行優化。
           

好了,聰明如你,知道了如何MongoDB查詢優化,是不是很歡喜 _

還有其他問題的可以在評論區留言或者掃碼加部落客擷取資源或者提問。

昊鼎王五:如何MongoDB查詢優化?