12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MongoDB入門してみた(2)インデックスの取り扱い

Posted at

個人用備忘録。

このページでわかること

MongoDBにおけるインデックスの取り扱い方法

インデックス操作の種類

  1. インデックスを確認する
  2. インデックスを新規作成する
  3. インデックスを削除する

インデックスの確認

データベース全体のインデックス確認

データベース全体のインデックス確認
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()を実行する)

インデックスの利用確認(explain())
db.コレクション名.find(~~~~~).explain()

winningPlanの内容からindexNameなどが指定されているかを確認する。

explainの結果の例

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})
12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?