MongoDBの検索が遅いときのIndex作成方法

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以下のQueryを例にする。

db.test_collection.find({ "content.a" : "aaaa", "content.sub_content.b" : "bbbb", "sex" : "male" }).sort({ "createdAt" : -1 }).limit(30)

Indexを作成するときはRDBと同じく以下を考慮する。

  • 最初に検索条件、次に並べ替え順序(上記の場合、検索条件は”content.a”, “content.sub_content.b”, “sex”、並べ替え順序は”createdAt”)
  • find関数の実行速度を考慮し、検索条件は大きく検索対象を絞り込めるものから指定(上記の場合、”sex”(性別)はnullを含めても値が3種類しかないので指定を後回しにする)
  • 並べ替え順序はクエリーが指定している順(上記の場合、並べ替えは”createdAt”の降順のみであるが、複数指定されている場合はその順番に指定)

実際の手順としては以下の通り。

# mongoDBにログイン
mongo
> # 検索対象のデータベースに移動
> use test_database
> # Queryの体感実行速度を確認
> db.test_collection.find({ "content.a" : "aaaa", "content.sub_content.b" : "bbbb", "sex" : "male" }).sort({ "createdAt" : -1 }).limit(30)
> # Queryを実行計画を確認
> db.test_collection.find({ "content.a" : "aaaa", "content.sub_content.b" : "bbbb", "sex" : "male" }).sort({ "createdAt" : -1 }).limit(30).explain()
> # 現在のindex一覧を確認
> db.test_collection.getIndexes()
> # indexを作成
> db.test_collection.createIndex({ "content.a" : 1, "ohai_attributes.customer_info.matter_id: 1", "data_type" : 1, "createdAt" : -1 })
> # indexが作成できたことを確認
> db.test_collection.getIndexes()
> # Queryの体感実行速度を確認
> db.test_collection.find({ "content.a" : "aaaa", "content.sub_content.b" : "bbbb", "sex" : "male" }).sort({ "createdAt" : -1 }).limit(30)
> # Queryを実行計画を確認
> db.test_collection.find({ "content.a" : "aaaa", "content.sub_content.b" : "bbbb", "sex" : "male" }).sort({ "createdAt" : -1 }).limit(30).explain()

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.