個人用備忘録。
このページでわかること
MongoDBにおけるインデックスの取り扱い方法
インデックス操作の種類
- インデックスを確認する
- インデックスを新規作成する
- インデックスを削除する
インデックスの確認
データベース全体のインデックス確認
use 利用するデータベース名
db.system.indexes.find()
となっているが、Percona server for mongodbでは表示されず。。。。。。
(明示的にインデックスを作成していないのが原因か?)
特定のコレクション毎のインデックス確認
db.コレクション名.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.col1"
}
]
う〜ん、_idフィールドにインデックスかかっていて,
インデックス名が_id_、名前空間がtest.col1ってことないな
(データベース名がtest, コレクション名がcol1)
インデックスの新規作成
db.コレクション名.createIndex(インデックス指定ドキュメント)
{
インデックスの対象とするキー名: 1 | -1
}
1を指定すると昇順のインデックス、
-1を指定すると降順のインデックスとなる。
複数のキーを指定することで、複合インデックスになる。
インデックスの利用有無の確認
インデックスが利用されているかを確認する手段をしては
カーソルに対してexplainを行います。
(つまりfindの結果を変数で受けるとそれがカーソルとなるので、
それに対してexplain()を実行する)
db.コレクション名.find(~~~~~).explain()
winningPlanの内容からindexNameなどが指定されているかを確認する。
explainの結果の例
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.col2",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"n" : {
"$lt" : 10005
}
},
{
"n" : {
"$gte" : 10000
}
}
]
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"n" : 1
},
"indexName" : "n_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"n" : [
"[10000.0, 10005.0)"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "69af8510a0fa",
"port" : 27017,
"version" : "3.2.7-1.1",
"gitVersion" : "3bd0157c170e79dcc91b3a1525facd9eba3c9ba3"
},
"ok" : 1
}
stageでIXSCAN(IndeXSCAN)となっているので、インデックスが利用されている。
stageでCOLLSCANの場合はコレクションの全スキャンが行われている。
インデックスの削除
db.コレクション名.dropIndex(インデクス指定ドキュメント)
補足
様々なインデックス
インデックスの種類 | 意味 |
---|---|
TTLインデックス | 生存期間が指定されたインデックス一定時間が経過下ドキュメントは削除される |
スパースインデックス | インデックスに指定したキーが存在しないドキュメントはインデックスの対象としないインデックス |
地理空間インデックス | 距離・包含関係・重なりなどを計算するためのインデックス |
テキストインデックス | 全文検索用インデックス(日本語の形態素解析には対応していないので基本的に日本語相手では役に立たない) |
カバードクエリ
カバードクエリとは、インデックスの中に含まれるデータのみのアクセスで
処理が完結し、実際のドキュメントへのアクセスが発生しない場合のクエリを指す。
操作の情報取得
db.setProfilingLeve(プロファイリングのレベル)
プロファイリングのレベルは3種類
レベル | 内容 |
---|---|
0 | 情報を取得しない |
1 | 遅いクエリの情報のみを取得 |
2 | すべての操作の情報を取得 |
遅いクエリの定義は...(汗
操作の実行統計取得
db.setProfilingLevel()で1か2を指定した後ならば、
操作の実行統計を取得できる。(1は遅いクエリのみ、2は全クエリ)
通常の運用なら1にしておけば良い?
db.system.profile.find({}, {command: 1, millis: 1})