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に収まらないからもっと容量大きいのに買い替えたりシャーディングしたり、あれこれ工夫したあの日々が何だったんだっていう。ただ一部挙動がよくわからないところがあって何だか怖い。恐る恐る使ってる感じです。