成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

高性能mongodb之應(yīng)用程序跑執(zhí)行計(jì)劃

derek_334892 / 1007人閱讀

摘要:執(zhí)行計(jì)劃之前發(fā)了一篇關(guān)于執(zhí)行計(jì)劃的說明。利用執(zhí)行計(jì)劃,我們可以判斷每一次的執(zhí)行情況和給出的執(zhí)行建議。在中跑執(zhí)行計(jì)劃的命令,舉個(gè)例子執(zhí)行計(jì)劃的模式為三種。程序中跑執(zhí)行計(jì)劃我使用的是庫(kù)用的是。響應(yīng)結(jié)果會(huì)有執(zhí)行時(shí)間掃描記錄數(shù)等真實(shí)的執(zhí)行情況。

執(zhí)行計(jì)劃

之前發(fā)了一篇關(guān)于mongodb執(zhí)行計(jì)劃的說明。利用執(zhí)行計(jì)劃,我們可以判斷每一次sql的執(zhí)行情況和mongodb給出的執(zhí)行建議。在mongo shell中跑執(zhí)行計(jì)劃的命令,舉個(gè)例子:

db.collecitonName.find({}).explain("queryPlanner")

執(zhí)行計(jì)劃的模式為三種:queryPlanner executionStats allPlansExecution。第一種不會(huì)真正跑命令本身,只有響應(yīng)命令分析后的報(bào)告。上面例子的響應(yīng)結(jié)果就是對(duì) db.collecitonName.find({}) 這個(gè)查詢語句的分析。

程序中跑執(zhí)行計(jì)劃

我使用的是java, mongodb庫(kù)用的是mongodb-java-driver。mongodb-java-driver的API提供了兩種方式去跑執(zhí)行計(jì)劃:

方式一:
MongoClient mongoClient = new MongoClient(new ServerAddress(host, port));
mongoClient.getDB("xxx").getCollection("yyy").find(quert).explain();

這是一個(gè)便捷的方式。這種方式會(huì)真正執(zhí)行命令,也就是說它使用的是executionStats模式。響應(yīng)結(jié)果會(huì)有執(zhí)行時(shí)間、掃描記錄數(shù)等真實(shí)的執(zhí)行情況。如果你的程序想要在命令執(zhí)行前做一個(gè)預(yù)判,這個(gè)API不是你想要的。

方式二:

API沒有提供queryPlanner的方式。我花了一些時(shí)間去搜索資料,發(fā)現(xiàn)網(wǎng)上沒有跑queryPlanner的需求,至少我是沒有找到類似的發(fā)問和使用例子。糾結(jié)了一會(huì)兒,最終發(fā)現(xiàn)庫(kù)里有這樣一個(gè)api, mongoClient.getDB("xxx").command(BasicDBObject command),支持程序傳入一個(gè)命令。最后在官方文檔里找到了這樣一個(gè)說明:

explain

New in version 3.0.

The explain command provides information on the execution of the following commands: aggregate, count, distinct, group, find, findAndModify, delete, and update.

Although MongoDB provides the explain command, the preferred method for running explain is to use the db.collection.explain() and cursor.explain() helpers.

The explain command has the following syntax:

語法如下:

{
   explain: ,
   verbosity: 
}

explain: 。 支持  aggregate, count, distinct, group, find, findAndModify, delete, and update等等的命令。
verbosity: 。支持模式"queryPlanner" 、"executionStats"  、"allPlansExecution" (Default)

跟蹤find進(jìn)去,find支持的字段如下,應(yīng)有盡有。

{
   "find": ,
   "filter": ,
   "sort": ,
   "projection": ,
   "hint": ,
   "skip": ,
   "limit": ,
   "batchSize": ,
   "singleBatch": ,
   "comment": ,
   "maxScan": ,   // Deprecated in MongoDB 4.0
   "maxTimeMS": ,
   "readConcern": ,
   "max": ,
   "min": ,
   "returnKey": ,
   "showRecordId": ,
   "tailable": ,
   "oplogReplay": ,
   "noCursorTimeout": ,
   "awaitData": ,
   "allowPartialResults": ,
   "collation": 
}

通過閱讀文檔,跑queryPlanner模式的執(zhí)行計(jì)劃應(yīng)該是這樣的:

//查詢某個(gè)集合,queryCondition是查詢條件。

MongoClient mongoClient = MongoUtil.getConnection(mongodb.getHost(), mongodb.getPort(), "", "", mongodb.getDb());
BasicDBObject command = new BasicDBObject();
BasicDBObject find = new BasicDBObject();
find.put("find", "集合名");
find.put("filter", queryCondition);//查詢條件,是一個(gè)BasicDBObject
command.put("explain", find);
command.put("verbosity", "queryPlanner");
CommandResult explainResult = mongoClient.getDB(mongodb.getDb()).command(command);
python程序中跑執(zhí)行計(jì)劃遇到的坑

使用 pymongo庫(kù)

import json
import pymongo

if __name__ == "__main__":
    client = pymongo.MongoClient(host="127.0.0.1", port=27017)
    #指定一個(gè)db
    db = client.get_database(name="datanamexxx")

    command = {}
    explain = {}
    #要操作的集合
    explain["find"] = "collectionnamexxx"
    #查詢的條件
    explain["filter"] = {"col1":"202060056"}
    verbosity = "executionStats"
    command["explain"] = explain
    command["verbosity"] = verbosity
    print json.dumps(db.command(command=command))

以上程序是有問題的,不能達(dá)到想要的目的(一次查詢的執(zhí)行情況)。后來經(jīng)過查閱mongo文檔和嘗試,明確是使用方式不正確導(dǎo)致的。
錯(cuò)誤原因:mongo的command要求參數(shù)是有序的,因?yàn)槭讌?shù)是命令名。正如上面的find命令:

{
   "find": , #命令名
   "filter": ,
   "sort": ,
   "projection": ,
   "hint": ,
   "skip": ,
   "limit": ,
   "batchSize": ,
   "singleBatch": ,
    ...

mongo驅(qū)動(dòng)在處理命令時(shí)首先要知道執(zhí)行哪個(gè)命令,然而 python的dict或者的java的map再或者所有的map數(shù)據(jù)結(jié)構(gòu)都是無序的。我們需要一個(gè)記錄參數(shù)的順序,使用者需要把首參數(shù)設(shè)置在最前面。我們來看看驅(qū)動(dòng)的源碼,原理其實(shí)是對(duì)dict封裝一層,添加一個(gè)list來記錄參數(shù)順序:

#繼承dict
class SON(dict):
    def __init__(self, data=None, **kwargs):
        #__keys就是記錄參數(shù)順序的列表
        self.__keys = []
        dict.__init__(self)
        self.update(data)
        self.update(kwargs)
    #省略...
    #打印時(shí),按__keys的順序拼字符串,合理
    def __repr__(self):
        result = []
        for key in self.__keys:
            result.append("(%r, %r)" % (key, self[key]))
        return "SON([%s])" % ", ".join(result)

    #設(shè)置元素時(shí),先把key按順序保存下來
    def __setitem__(self, key, value):
        if key not in self.__keys:
            self.__keys.append(key)
        dict.__setitem__(self, key, value)

    def __delitem__(self, key):
        self.__keys.remove(key)
        dict.__delitem__(self, key)

    #省略...
pymongo正確的使用方式
import json
import pymongo

if __name__ == "__main__":
    client = pymongo.MongoClient(host="127.0.0.1", port=27017)
    #指定一個(gè)db
    db = client.get_database(name="datanamexxx")
    
    #注意順序
    explainSon = SON([("find", "collectionnamexxx"),
               ("filter", {"uid": "202060056"})])
    cmd = SON([("explain", explainSon),
               ("verbosity", "queryPlanner")])
    print json.dumps(db.command(cmd))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19496.html

相關(guān)文章

  • 性能mongodb執(zhí)行計(jì)劃

    我的專欄地址:我的segmentfault,歡迎瀏覽 一、執(zhí)行計(jì)劃介紹 MongoDB 3.0之后,explain的返回與使用方法與之前版本有了不少變化,介于3.0之后的優(yōu)秀特色,本文僅針對(duì)MongoDB 3.0+的explain進(jìn)行討論?,F(xiàn)版本explain有三種模式,分別如下: queryPlanner executionStats allPlansExecution 其中 qu...

    senntyou 評(píng)論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...

    ermaoL 評(píng)論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...

    kamushin233 評(píng)論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...

    yy736044583 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<