MongoDB性能編シリーズ(16)——性能最適化(一)——オプティマイザProfile

5578 ワード

オプティマイザプロファイル
MySQLのSlowQueryのようなものです.
スロー・クエリー・ログは、一般的に最適化ステップの最初のステップとして使用されます.遅いクエリー・ログを使用して、各文のクエリー時間を指定します.たとえば100 msを超えると、クエリが100 msを超える文を最適化する必要があります.そして通過しますexplain解析は行数が大きすぎるかどうかに影響するため,クエリ文が100 msを超える.したがって、最適化の手順は一般的に:1.遅いクエリーログで100 msを超える文を見つけます.次にexplainで影響行数を解析し,なぜ100 msを超えるのかを解析する.家にインデックスを付ける必要があるかどうかを決定します.
MongoDBデータベースProfileは、データベースの最適化の根拠として使用できる遅いクエリー・ログ機能です.
Profileスロークエリーログ機能はデフォルトでオフです.
Profilingのスイッチとレベルを制御するには、2つの方法があります.
方法1:MongoDBを起動するときに--profile=レベルを付ければよい.
方法2:クライアントでdbを呼び出す.setProfilingLevel(..レベル.)コマンドを使用して、リアルタイムの構成を実現します.
Profile情報保存再システム.profileで.dbを通じてgetProfilingLevel()コマンドを使用して、現在のProfileレベルを取得します.
上記のprofileのレベルは0,1,2とすることができ、意味は:
profileレベル
意味
0
開かない
1
遅いクエリーの記録(デフォルトは>100 ms)
2
すべてのコマンドを記録
Profile再レベル1の場合はスローコマンドが記録されます.上のデフォルト値は100 msで、デフォルトがあれば設定されます.その設定方法とレベルには2つの方法があります.
1つは、--slowmsを追加してパラメータ構成を開始することです.
もう1つはdbです.setProfilingLevelに2番目のパラメータを追加します.
まず、データベースを用意します.
> use dt6
switched to db dt6
> db
dt6
> for(i=0;i<10;i++){db.c1.insert({name:"s"+i,age:20+i,parents:{father:"f"+i,mother:"m"+i}})}
WriteResult({ "nInserted" : 1 })
> db.c1.find()
{ "_id" : ObjectId("550aac29f237dcbf6bee2cb2"), "name" : "s0", "age" : 20, "parents" : { "father" : "f0", "mother" : "m0" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cb3"), "name" : "s1", "age" : 21, "parents" : { "father" : "f1", "mother" : "m1" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cb4"), "name" : "s2", "age" : 22, "parents" : { "father" : "f2", "mother" : "m2" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cb5"), "name" : "s3", "age" : 23, "parents" : { "father" : "f3", "mother" : "m3" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cb6"), "name" : "s4", "age" : 24, "parents" : { "father" : "f4", "mother" : "m4" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cb7"), "name" : "s5", "age" : 25, "parents" : { "father" : "f5", "mother" : "m5" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cb8"), "name" : "s6", "age" : 26, "parents" : { "father" : "f6", "mother" : "m6" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cb9"), "name" : "s7", "age" : 27, "parents" : { "father" : "f7", "mother" : "m7" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cba"), "name" : "s8", "age" : 28, "parents" : { "father" : "f8", "mother" : "m8" } }
{ "_id" : ObjectId("550aac2af237dcbf6bee2cbb"), "name" : "s9", "age" : 29, "parents" : { "father" : "f9", "mother" : "m9" } }
>

では、まず最初の方法でProfileスロークエリーを起動してみましょう.
> db.getProfilingLevel()
0
> 
> db.setProfilingLevel(1)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
> db.getProfilingLevel()
1
> db.setProfilingLevel(1,10)
{ "was" : 1, "slowms" : 100, "ok" : 1 }
> 
> db.setProfilingLevel(1,1000)
{ "was" : 1, "slowms" : 10, "ok" : 1 }
> 
> db.setProfilingLevel(1,1000)
{ "was" : 1, "slowms" : 1000, "ok" : 1 }
> 
> db.setProfilingLevel(0)
{ "was" : 1, "slowms" : 1000, "ok" : 1 }
> db.getProfilingLevel()
0
>

ここで、設定するたびに返される結果は、レベル、時間パラメータを含む変更前の状態であることに注意してください.
第2の方法は、mongodサービスを閉じてから再起動し、--profileと--slowmsを設定して設定する必要があります.
この方法はmongodb全体のすべてのデータベースに有効です!!
[neil@neilhost ~]$ sudo pkill mongod
[neil@neilhost ~]$ pstree -p |grep mongod
[neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs --profile=1 --slowms=200 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 3244
child process started successfully, parent exiting
[neil@neilhost ~]$ pstree -p |grep mongod           |-mongod(3244)-+-{mongod}(3245)
           |              |-{mongod}(3246)
           |              |-{mongod}(3247)
           |              |-{mongod}(3248)
           |              |-{mongod}(3249)
           |              |-{mongod}(3250)
           |              |-{mongod}(3251)
           |              |-{mongod}(3252)
           |              `-{mongod}(3253)
[neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongo
MongoDB shell version: 2.6.8
connecting to: test
> db.getProfilingLevel()
1
> use dt6
switched to db dt6
> db.getProfilingLevel()
1

その後、サービスを停止した後、元のデフォルトの方法で再起動し、データベースのProfileレベルを再表示すると、元の状態に戻りました.これは、2つ目の方法で、すべてのデータベースに有効ですが、再サービスがオフになっても、このProfileのレベル設定は保存されません.あるいは、第2の方法は、「データベース」ではなく「サービス」のProlfeを設定することであるため、サービスが停止すると、パラメータ設定を起動するProfileが消えてしまうと理解できる.逆に、第1の方法は、クライアントがデータベースを制御する際に特定のデータベースの設定を行うので、設定結果は保存されます.
ところで、スロークエリの「スロー」の定義は何ですか?
時間のかかるコマンドとして理解できます
クエリーに10 msかかると、システムに記録されます.profile