mongoDB index のメモリ読み込みについて

279 views
Skip to first unread message

Ryuichiro Nishimura

unread,
May 6, 2015, 10:07:37 PM5/6/15
to mongo...@googlegroups.com
お世話になっております。

mongoDB のインデックス動作を再確認しようと思い、

1) データ登録
2) インデックス設定
3) find().explain()

を試しました。

MongoDB shell version: 2.6.9

(データ)
> db.test1.stats(1024*1024)
{
        "ns" : "nishimura.test1",
        "count" : 10000002,
        "size" : 2288,
        "avgObjSize" : 239,
        "storageSize" : 2763,
        "numExtents" : 21,
        "nindexes" : 2,
        "lastExtentSize" : 721,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 1,
        "totalIndexSize" : 549,
        "indexSizes" : {
                "_id_" : 309,
                "h.t_1" : 239
        },
        "ok" : 1
}


(mongoDB起動直後のサーバーステータス(メモリ))
> db.serverStatus().mem
{
        "bits" : 64,
        "resident" : 45,
        "virtual" : 8555,
        "supported" : true,
        "mapped" : 4127,
        "mappedWithJournal" : 8254
}


(h.t のインデックスを使って、データ10,000件程度を取得するクエリーを発行)
> db.test1.find({'h.t':{'$gte':1400010000,'$lte':1400020000}}).explain()
{
        "cursor" : "BtreeCursor h.t_1",
        "isMultiKey" : false,
        "n" : 10001,
        "nscannedObjects" : 10001,
        "nscanned" : 10001,
        "nscannedObjectsAllPlans" : 10001,
        "nscannedAllPlans" : 10001,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 78,
        "nChunkSkips" : 0,
        "millis" : 19,
        "indexBounds" : {
                "h.t" : [
                        [
                                1400010000,
                                1400020000
                        ]
                ]
        },
        "server" : "localhost:27017",
        "filterSet" : false
}


(クエリー後のサーバーステータス)
> db.serverStatus().mem
{
        "bits" : 64,
        "resident" : 48,
        "virtual" : 8555,
        "supported" : true,
        "mapped" : 4127,
        "mappedWithJournal" : 8254
}


予想としては、resident サイズが、インデックス+データ分になると
考えていたのですが、resident はデータ分のみ増える、という結果で
した。

実際、インデックス情報はどこに乗ってるんでしょうか。
(乗せて、不要になったら消している?)


サーバーのメモリが小さめなので、それが影響しているのか?
メモリ情報も添付しておきます。

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1560       1498         62         24         75       1168
-/+ buffers/cache:        254       1306
Swap:        16383          0      16383














Hiroaki Kubota

unread,
Jun 5, 2015, 11:01:48 PM6/5/15
to mongo...@googlegroups.com
窪田です。
僕の理解では、起動した直後に既にインデックスはメモリに乗っています。
なので、resident の増分はFETCHデータ量と一致するはずです

2015年5月7日 11:07 Ryuichiro Nishimura <nishimry...@gmail.com>:

--
このメールは Google グループのグループ「MongoDB JP」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには mongodb-jp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには mongo...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/mongodb-jp からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Tetsutaro Watanabe

unread,
Jun 7, 2015, 7:45:04 PM6/7/15
to mongo...@googlegroups.com
渡部です

TO 西村さん

何が問題なのかわかりません。
事象を整理すると

・コレクションの件数は1000万件
・コレクションのサイズは2.2G
・当該インデックスのサイズは240M
・インデックスを用いて1000万件中1万件を問い合わせた
・想定では、1/1000を取り出すクエリだから
 データは2.2M増えるはず
  インデックスは0.2M+αぐらい増えるはず
・実際は物理メモリは45Mから48Mに上昇した

何も問題ないように思えますが・・・


TO 窪田さん

インデックスの総サイズは549Mですので、起動時の物理メモリが45Mであることをかんがえると、
起動時に乗っているわけではないんじゃないでしょうか?

2015年6月6日 12:01 Hiroaki Kubota <cat.s...@gmail.com>:

Tetsutaro Watanabe

unread,
Jun 7, 2015, 7:55:08 PM6/7/15
to mongo...@googlegroups.com
西村さん

補足しますと、クエリをかけるときに使わないインデックスはメモリにのりません。btreeを辿るときに、必要なbtreeノードだけがメモリに乗ります。btrr全体がメモリにのるわけではありません。

2015年6月8日月曜日、Tetsutaro Watanabe<fet...@gmail.com>さんは書きました:

Hiroaki Kubota

unread,
Jun 10, 2015, 7:04:54 PM6/10/15
to mongo...@googlegroups.com
あ、stats の引数を見逃しました。すみません。TT

2015年6月8日 8:55 Tetsutaro Watanabe <fet...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages