db.system.profile.find();
Profiling Levelsの設定次第ですが、スロークエリーがdb.system.profile
に格納されているので、ここから探す。
ただ、明らかにスロークエリーなはずのaggregate()
で発行したクエリーが、何故かここから見つけられなかったので、もしかしたらAggregation Frameworkのクエリーはここには入らないのかもしれない。
http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/
db.currentOp();
mongo shellでdb.currentOp()
を使うと、発行時点で実行中のクエリーが見られる。
同時に複数のクエリーが走っているので、1個じゃなく全部(じゃ無いかもだけど複数)のクエリーが表示される。
重たいaggregate()
クエリーを実行させて、終わる前にdb.currentOp()
を使うと見られるはず。
db.currentOp() "opid" : -2016542264, "active" : false, "lockType" : "write", "waitingForLock" : true, "op" : "update", "ns" : "", "query" : { "$msg" : "query not recording (too large)" }, "client" : "X.X.X.X:42135", "desc" : "conn", "threadId" : "0x7f10f7cf8700", "connectionId" : 754951, "numYields" : 0
query not recording (too large)
となって、肝心のクエリーが見られない事がありました。
db.system.profile
に入ってなかったのも、もしかしたらこれに該当したクエリーだからだったのかもしれない。
$ less /var/log/mongo/mongod.log
Profiling Levelsやログ関係の設定次第だと思うけど、スロークエリーがログファイルに出力される。 上記2つの方法でだめだった場合でも、ログファイルには記録されていたので、これなら確認出来る可能性高いと思う。
スロークエリーが記録されてそれを見るという方法なので、スロークエリーになってないと見られない。 環境次第だけど、一時的にスロークエリーに該当する閾値を極端に厳しくして、記録させれば見られると思う。
https://jira.mongodb.org/browse/SERVER-4504
前述の通りexplainが使えない。
var pipeline = [/*ここにaggregate()に渡す引数を書く*/]
var before = new Date();
db.things.aggregate(pipeline);
var after = new Date();
execution_mills = after - before;
かなりとりあえずの方法だけど、pipelineを色々と書き換えて、速度改善するか調べる。
- http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/
- http://stackoverflow.com/questions/12702080/mongodb-explain-for-aggregation-framework
- http://stackoverflow.com/questions/13466079/aggregate-framework-cant-use-indexes
- http://gihyo.jp/dev/serial/01/mongodb/0012
- http://devsmash.com/blog/mongodb-ad-hoc-analytics-aggregation-framework