導入
MongoDB が使用するストレージ エンジンは WiredTiger で、インデックス構築には B+ ツリーが使用されます。
インデックスタイプ
単一のインデックス
db.members.createIndex({name:1});
複合インデックス
db.members.createIndex({ name:1,age:-1});
他のインデックス
地理空間インデックス、テキストインデックス、ハッシュインデックス。
#空間インデックス
db.members.createIndex({location : "2dsphere"})
#テキストインデックス
db.reviews.createIndex( { comments: "text" } )
# ハッシュインデックス
db.collection.createIndex( { _id: "hashed" } )
出典:索引タイプの地理空間索引
インデックス管理
チェック
すべてのインデックスを表示
#この構文コマンドには MongoDB 3.0 以降が必要です
db.collection.getIndexes()
作成
文法:
db.collection.createIndex(キー、オプション)
キー: 値は作成するインデックスフィールドです。
1: インデックスを昇順に作成するように指定します。
-1: インデックスを降順に作成します。
例
db.members.createIndex({name:1});
オプション: オプションのパラメータを受け取ります
例
#バックグラウンド
db.values.createIndex({open: 1, close: 1}, {background: true})
# 一意のインデックスを作成する
ドキュメント内のフィールドに重複した値がある場合、そのフィールドに一意のインデックスを作成することはできません。
新しく追加されたドキュメントに一意にインデックス付けされたフィールドがない場合、フィールドが欠落している最初のドキュメントのみを追加でき、インデックスのキー値は null に設定されます。
db.members.createIndex({age:1},{unique:true});
# インデックスのスパース性
同じインデックスが一意かつスパースである場合、インデックス キー値が欠落している複数のドキュメントを保存できます。
db.sparsedemo.createIndex({name:1},{unique:true ,sparse:true});
出典: MongoDB インデックスの作成_Shuiyue Qinghui のブログ-CSDN Blog_mongodb インデックスの作成
消去
#インデックス名で削除
db.members.dropIndex("索引名称")
#定義により削除
db.members.dropIndex({name:1})
実行計画分析(説明)
クエリのパフォーマンスを分析する
クエリ パフォーマンスの分析 (クエリ パフォーマンスの分析) では、通常、実行プラン (説明プラン、説明プラン) を使用して、クエリに費やされた時間、インデックス クエリに基づいているかどうかなど、クエリの状況を表示します。
db.members.explain().find({name:"xxx"})
ここでは、winingPlan の stage の値の意味に焦点を当てる必要があります。
COLLSCAN: コレクション全体をスキャン
IXScan: インデックス スキャン
FETCH: インデックスが指すドキュメントのアドレスに基づくクエリ (mysql のテーブルに戻るクエリと同等) PROJECTION_COVERED
: マップ カバレッジ、テーブル クエリに戻る必要はありません
SORT: メモリ内でソートする必要があるため、効率が良くありません。
カバレッジクエリ
クエリ条件とクエリの <projection> にインデックス付きフィールドのみが含まれている場合、MongoDB はドキュメントをスキャンしたりメモリにドキュメントを取り込んだりせずに、インデックスから直接結果を返します。これらの対象クエリは非常に効率的です。
db.members.explain().find({ name:"zhangsan"},{_id:0, name:1});
実際の使用では、winingPlan.stage を PROJECTION_COVERED に最適化する必要があります。
データの有効期間
日付フィールド、または日付要素を含む配列フィールドの場合、有効期間を持つインデックスを使用して、フィールド値が有効期間を超えるドキュメントを自動的に削除できます。
構造データ
db.members.insertMany( [
{
name:"zhangsanss",
age:19,tags:["00","It","SH"],
create_time:new Date()}
] );
インデックスを構築する
db.members.createIndex({ create_time: 1},{expireAfterSeconds:30 });
create_time フィールドに生存時間 30 秒のデータが作成されます。
複合キーインデックスには有効期間プロパティがありません
インデックス キーが日付要素を含む配列フィールドである場合、配列内の最小の日付を使用してドキュメントの有効期限が切れているかどうかが計算されます。
データベースはバックグラウンド スレッドを使用して期限切れのドキュメントを監視および削除するため、削除操作にはある程度の遅延が発生する場合があります。
ソース: