かまたま日記3

プログラミングメイン、たまに日常

MongoDBで遅いクエリのチェックをする

まず現在activeなprocessの一覧をみます。db.currentOp()関数を使います。

  • secs_runningが130なので130秒実施中ってことになります、時間かかってますね〜。
  • queryに現在発行中のクエリが出ます。ちなみにあまりにクエリが長すぎるとQuery Too Long的なエラーが出て内容が見れません。
  • planSummaryってことろに実行計画が出ます。COLLSCANはコレクションス全キャンってことでインデックスが効いてません、ここが怪しい。

という感じで見ていきます。

mongos> db.currentOp()
{
    "inprog" : [
        {
            "desc" : "conn4",
            "threadId" : "0x3981860",
            "connectionId" : 4,
            "opid" : "123456",
            "active" : true,
            "secs_running" : 130,
            "microsecs_running" : NumberLong(130787208),
            "op" : "query",
            "ns" : "testdb.users",
            "query" : {
                "username" : "kamatama41"
            },
            "planSummary" : "COLLSCAN",
            "client_s" : "xxxxxxxx:xxxx",
            "numYields" : 33046,
            "locks" : {
                "Global" : "r",
                "MMAPV1Journal" : "r",
                "Database" : "r",
                "Collection" : "R"
            },
            "waitingForLock" : false,
            "lockStats" : {
                "Global" : {
                    "acquireCount" : {
                        "r" : NumberLong(66094)
                    }
                },
                "MMAPV1Journal" : {
                    "acquireCount" : {
                        "r" : NumberLong(33047)
                    }
                },
                "Database" : {
                    "acquireCount" : {
                        "r" : NumberLong(33047)
                    }
                },
                "Collection" : {
                    "acquireCount" : {
                        "R" : NumberLong(33047)
                    }
                }
            }
        },
        {
                    ....
        }
    ]
}