studylog/北の雲

chainer/python/nlp

MongoDBでskipをなるべく使わない

MongoDBインアクションを久々に読んでみてなるほどと思った所をメモ。

P113

  • 50000番目のエントリを取って来るのにskip(50000)とやるとそこまで全部読むので非効率
  • それを回避する為に検索条件に取りたいエントリの_idとかインデックスが張られたものをクエリ条件に含めることでskip自体を使わない

手元の100万件入ってるやつで実験したところ、

  • skip(500000) => 400ms
  • (id__gt = "55500f74530a691494df02fb") =>1~2ms (55500f74530a691494df02fbが直前のid)

凄まじい差になった。(ちなみにMongoengineのクエリです)

例えばwebアプリのページングとかに安易にskipを使うとマズいと。はてブglassは完全にskip依存で最近は滅茶苦茶動作が遅くなって来てる。こんなのはMongoDBに限らずDB全般の基本なんだろうなあ。知らなかった。

余談だけど一部MongoDB3.0のWiredTigarに上げてみたら噂通りビックリするぐらいストレージ容量が減ってて凄い。手元のSSDに収まらないからもっと容量大きいのに買い替えたりシャーディングしたり、あれこれ工夫したあの日々が何だったんだっていう。ただ一部挙動がよくわからないところがあって何だか怖い。恐る恐る使ってる感じです。