中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

Index intersection を試してみた。(失敗談)

MongoDB 2.6 からIndex intersectionという機能が追加された。
1つのクエリーで2つのインデックスを使う(かもしれない)機能で、より効率的にクエリーを処理できる。
(どう効率的なのか?はこのへんが詳しい)

さて、じゃあ実際に見てみようというのが今回の趣旨。

元データ

国土地理院が公開している住所情報が手元にあったのでこれを使うことにした。
大体1000万件/4GB弱のデータ。

> db.block_master.stats().count
11700898
> db.block_master.stats().size
3713899792
> db.block_master.findOne()
{
        "_id" : ObjectId("52b8378dab3de2fd4abb193f"),
        "full" : "北海道 札幌市中央区 南七条西十一丁目 1281",
        "pref" : ObjectId("52b8378dab3de2fd4abb193c"),
        "pref_name" : "北海道",
        "city" : ObjectId("52b8378dab3de2fd4abb193d"),
        "city_name" : "札幌市中央区",
        "town" : ObjectId("52b8378dab3de2fd4abb193e"),
        "town_name" : "南七条西十一丁目",
        "name" : "1281",
        "loc" : {
                "type" : "Point",
                "coordinates" : [
                        141.342094,
                        43.050264
                ]
        }
}

Indexを張る

db.block_master.ensureIndex({pref_name:1});
db.block_master.ensureIndex({city_name:1});
db.block_master.ensureIndex({town_name:1});

今までは、複合インデックスを張っておかないと大変だったのだがさてどうなるか。。。

ちょっとデータを確認

Index intersection はそれぞれのインデックスで絞り込んだ結果の共通部分を抜き出すので、投げるクエリーを検討する。

  1. 幾つかの県にある同名の市区町村
  2. 幾つかの市区町村にある同名の町丁

が狙い目だ。

> db.block_master.aggregate([
  { $group: {_id: {city: "$city_name", pref: "$pref_name"}}},
  { $group: {_id: "$_id.city", num: {$sum: 1}, prefs: {$push: "$_id.pref"}}},
  { $match: {num: {$gt:1}}},
  { $sort:  {num: -1}}
 ])
{ "_id" : "伊達市", "num" : 2, "prefs" : [ "福島県", "北海道" ] }
{ "_id" : "府中市", "num" : 2, "prefs" : [ "東京都", "広島県" ] }

へー意外と少ない!

> db.block_master.aggregate([
  { $group: {_id: {town: "$town_name", city: "$city_name"}}},
  { $group: {_id: "$_id.town", num: {$sum: 1}}},
  { $match: {num: {$gt:1}}},
  { $sort:  {num: -1}}
 ])
{ "_id" : "本町", "num" : 144 }
{ "_id" : "本町二丁目", "num" : 141 }
{ "_id" : "本町一丁目", "num" : 140 }
{ "_id" : "栄町", "num" : 133 }
{ "_id" : "本町三丁目", "num" : 114 }
{ "_id" : "新町", "num" : 106 }
{ "_id" : "幸町", "num" : 97 }
{ "_id" : "中央二丁目", "num" : 93 }
{ "_id" : "中央一丁目", "num" : 92 }
{ "_id" : "本町四丁目", "num" : 84 }
{ "_id" : "東町", "num" : 84 }
{ "_id" : "末広町", "num" : 79 }
{ "_id" : "旭町", "num" : 77 }
{ "_id" : "栄町二丁目", "num" : 75 }
{ "_id" : "中央三丁目", "num" : 74 }
{ "_id" : "栄町一丁目", "num" : 73 }
{ "_id" : "緑町", "num" : 72 }
{ "_id" : "南町", "num" : 69 }
{ "_id" : "泉町", "num" : 65 }
{ "_id" : "中町", "num" : 63 }
Type "it" for more
>

おお!流石の『本町』
意外な『栄町』!?
『新町』だと思ったのになぁ。。。
じゃなかった。。まあ兎に角この辺が狙い目。。

あと余談だけどaggregationがcursorで帰って来るようになったのも2.4から
それまでは単に配列で帰ってくるわ、64MB超えるとコケるわ。。ダメダメだった。
このaggregationも13970程帰って来たから、市区町村名までArrayに含めたらコケたでしょうね。

さてintersectionに戻ろう。。

チャレンジ1

クエリー
> db.block_master.find({city_name:'府中市', pref_name:'東京都'}).count()
5219
explain(true)
> var explain = db.block_master.find({city_name:'府中市', pref_name:'東京都'}).explain(true)
> explain.indexBounds
{ "city_name" : [ [ "府中市", "府中市" ] ] }
> explain.allPlans
[
        {
                "cursor" : "BtreeCursor city_name_1",
                "isMultiKey" : false,
                "n" : 5219,
                "nscannedObjects" : 13272,
                "nscanned" : 13272,
                "scanAndOrder" : false,
                "indexOnly" : false,
                "nChunkSkips" : 0,
                "indexBounds" : {
                        "city_name" : [
                                [
                                        "府中市",
                                        "府中市"
                                ]
                        ]
                }
        },
        {
                "cursor" : "BtreeCursor pref_name_1",
                "isMultiKey" : false,
                "n" : 0,
                "nscannedObjects" : 101,
                "nscanned" : 102,
                "scanAndOrder" : false,
                "indexOnly" : false,
                "nChunkSkips" : 0,
                "indexBounds" : {
                        "pref_name" : [
                                [
                                        "東京都",
                                        "東京都"
                                ]
                        ]
                }
        },
        {
                "cursor" : "Complex Plan",
                "n" : 0,
                "nscannedObjects" : 0,
                "nscanned" : 103,
                "nChunkSkips" : 0
        }
]
> explain.stats
{
        "type" : "KEEP_MUTATIONS",
        "works" : 13273,
        "yields" : 104,
        "unyields" : 104,
        "invalidates" : 0,
        "advanced" : 5219,
        "needTime" : 8053,
        "needFetch" : 0,
        "isEOF" : 1,
        "children" : [
                {
                        "type" : "FETCH",
                        "works" : 13273,
                        "yields" : 104,
                        "unyields" : 104,
                        "invalidates" : 0,
                        "advanced" : 5219,
                        "needTime" : 8053,
                        "needFetch" : 0,
                        "isEOF" : 1,
                        "alreadyHasObj" : 0,
                        "forcedFetches" : 0,
                        "matchTested" : 5219,
                        "children" : [
                                {
                                        "type" : "IXSCAN",
                                        "works" : 13272,
                                        "yields" : 104,
                                        "unyields" : 104,
                                        "invalidates" : 0,
                                        "advanced" : 13272,
                                        "needTime" : 0,
                                        "needFetch" : 0,
                                        "isEOF" : 1,
                                        "keyPattern" : "{ city_name: 1.0 }",
                                        "boundsVerbose" : "field #0['city_name']: [\"府中市\", \"府中市\"]",
                                        "isMultiKey" : 0,
                                        "yieldMovedCursor" : 0,
                                        "dupsTested" : 0,
                                        "dupsDropped" : 0,
                                        "seenInvalidated" : 0,
                                        "matchTested" : 0,
                                        "keysExamined" : 13272,
                                        "children" : [ ]
                                }
                        ]
                }
        ]
}
あれ!?

効かない。。
13272件舐めて5219件抽出した。
IXSCANで13272件舐めてFETCHで13273件って事は普通にcity_nameだけ使ったな。
city_name: '東京都'が22万件ほどあって全然絞れないから、
普通に処理することを選択したっぽい。

チャレンジ2

クエリー

期待の『本町』だ。

クエリー
> db.block_master.find({city_name: '松戸市', town_name: '本町'}).count()
25
データ数
> db.block_master.find({city_name: '松戸市'}).count()
30661
> db.block_master.find({town_name: '本町'}).count()
6563

良い感じのバランスである。

explain(true)
> db.block_master.find({city_name: '松戸市', town_name: '本町'}).explain(true).indexBounds
{ "town_name" : [ [ "本町", "本町" ] ] }
> db.block_master.find({city_name: '松戸市', town_name: '本町'}).explain(true).allPlans
[
        {
                "cursor" : "BtreeCursor town_name_1",
                "isMultiKey" : false,
                "n" : 25,
                "nscannedObjects" : 6563,
                "nscanned" : 6563,
                "scanAndOrder" : false,
                "indexOnly" : false,
                "nChunkSkips" : 0,
                "indexBounds" : {
                        "town_name" : [
                                [
                                        "本町",
                                        "本町"
                                ]
                        ]
                }
        },
        {
                "cursor" : "BtreeCursor city_name_1",
                "isMultiKey" : false,
                "n" : 15,
                "nscannedObjects" : 6564,
                "nscanned" : 6565,
                "scanAndOrder" : false,
                "indexOnly" : false,
                "nChunkSkips" : 0,
                "indexBounds" : {
                        "city_name" : [
                                [
                                        "松戸市",
                                        "松戸市"
                                ]
                        ]
                }
        },
        {
                "cursor" : "Complex Plan",
                "n" : 15,
                "nscannedObjects" : 0,
                "nscanned" : 6566,
                "nChunkSkips" : 0
        }
]
> db.block_master.find({city_name: '松戸市', town_name: '本町'}).explain(true).stats
{
        "type" : "KEEP_MUTATIONS",
        "works" : 6565,
        "yields" : 153,
        "unyields" : 153,
        "invalidates" : 0,
        "advanced" : 25,
        "needTime" : 6538,
        "needFetch" : 0,
        "isEOF" : 1,
        "children" : [
                {
                        "type" : "FETCH",
                        "works" : 6564,
                        "yields" : 153,
                        "unyields" : 153,
                        "invalidates" : 0,
                        "advanced" : 25,
                        "needTime" : 6538,
                        "needFetch" : 0,
                        "isEOF" : 1,
                        "alreadyHasObj" : 0,
                        "forcedFetches" : 0,
                        "matchTested" : 25,
                        "children" : [
                                {
                                        "type" : "IXSCAN",
                                        "works" : 6563,
                                        "yields" : 153,
                                        "unyields" : 153,
                                        "invalidates" : 0,
                                        "advanced" : 6563,
                                        "needTime" : 0,
                                        "needFetch" : 0,
                                        "isEOF" : 1,
                                        "keyPattern" : "{ town_name: 1.0 }",
                                        "boundsVerbose" : "field #0['town_name']: [\"本町\", \"本町\"]",
                                        "isMultiKey" : 0,
                                        "yieldMovedCursor" : 0,
                                        "dupsTested" : 0,
                                        "dupsDropped" : 0,
                                        "seenInvalidated" : 0,
                                        "matchTested" : 0,
                                        "keysExamined" : 6563,
                                        "children" : [ ]
                                }
                        ]
                }
        ]
}
またしても効かぬ。。。

これは理由が解らないな。。
『本町』は144もの市区町村に存在しており25/6563まで絞れるのにComplex Planが選択されなかった。

因みにallPlans の'松戸市'のnscanned が30661ではなく6564なのはこのバグである。

まとめ

Index intersectionの気持ちは解りませんでした。。

、、かといって今は精進(source code reading)してる暇は無いんだよなぁ。。。

MongoDB2.6.1 でやっとメジャーバージョンアップ

チェンジログ

http://docs.mongodb.org/master/release-notes/2.6-changelog/

ひたすらヤバイ者揃いですが、やっとメジャーバージョンアップ程度の品質になったかと。
やっと頑張れば使えるかな?

暇が出来次第
http://mongodb.jp/
を早々に生贄にする所存。。

MongoDB 2.4 => 2.6 アップデートした

2.6.1(人柱バージョン)にチャレンジ

2.4.4 => 2.6.1 バージョンアップ手順

今回データファイルには互換性があるので超簡単

ディレクトリ構成
/usr/local/mongo
 |- bin -> mongodb-linux-x86_64-2.4.4/bin
 |- mongodb-linux-x86_64-2.4.4
 |- data
 |- logs
 |- conf
     |- mongod.conf
手順
  • Download & extract
$ cd /tmp
$ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
$ cd /usr/local/mongo
$ tar xzvf /tmp/mongodb-linux-x86_64-2.6.1.tgz
  • 既存のmongodを落とす
$ kill `cat /usr/local/mongo/logs/mongod.pid`
  • Symlink切り替え
$ cd /usr/local/mongo
$ ln -sfT mongodb-linux-x86_64-2.6.1/bin bin
/usr/local/mongo
 |- bin -> mongodb-linux-x86_64-2.6.1/bin
 |- mongodb-linux-x86_64-2.4.4
 |- mongodb-linux-x86_64-2.6.1
 |- data
 |- logs
 |- conf
     |- mongod.conf
  • mongod起動
$ /usr/local/mongo/bin/mongod -f /usr/local/mongo/conf/mongod.conf

終わり

まとめ

も、何も一直線。
迷うところ無し。

相変わらずmongoの運用設計は秀逸!

ちょっと使ってみた所、geoJSON系が体感的に早くなってる気がする。
他の処理の互換性はいまチェック中。
今のところ大丈夫っぽいが、、

MongoDB2.6.0は時期尚早

MongoDBのメジャーバージョンアップはいつもの通り大混乱だ。
最早様式美ですらある。。

いつも思うがmongodb.incの連中はmongodb使って欲しい訳だ。
Eat yourown dog food !!


jira眺めてて、今問題が多そうな部分

  • インデクシング(全体的におかしい)
  • AggregateFW(今回の目玉だからね)
  • mongodump

個人的にはバックアップが取れなくなるmongodumpがクラッシュする問題が一番困る。。

そんな訳でアップグレードは2.6.2 - 2.6.4 辺りまで様子見のつもり。。
=> お前が率先して人柱やれよ!!
ってツッコミを受けそうですが、、最近ちょっとそこまで余裕無いので。。。

MongoDB2.6リリースノート斜め読み!

ご存知の通りMongoDB2.6がリリースされました!

相変わらず乱文で解説!!

Aggregation Enhancements

Aggregationが強化された。

db.collection.aggregate() がカーソルを返却するようになった
今まで最終結果には64MBの制約があったが、解消されたようだ。

というかそれが普通。。。

パイプラインがexplainをサポート
今までは感覚で是非を判断していたので嬉しい改善!
ディスクソートが効率的になった
$out オペレータで指定のコレクションに結果出力が可能
今までは結果をforで回して入れなおしてたのでこれも便利。
$redact でパイプライン中にデータの微修正ができる
あんまり使う機会が思い当たらない。。
多分この様な用途でMongoDBを使うこと自体が詰んでる。
新しいoperator
  • $let, $map
  • $literal, $size
  • $cond

この辺りはまたいずれ。。
本当に大規模のデータを扱ったときにAggregationは非力なので、ちょっと便利に使いたい人向けの機能と思ってよい。

Text Search Integration

大丈夫。使い物にならない。

Insert and Update Improvements

consistency に関わる改善がある。

MongoDBはドキュメントの"フィールド"の順番を保つルールがある
  • _id は常に先頭
  • フィールド値の更新やリネームは順番が変わる場合がある
UPDATE系の新オペレータ
  • $bit xor
  • $min/$max update if max or min
  • $push capped-array系(昔ここで解説した)に$position が追加
  • $currentDate (説明不要)
  • $mul multiplicative increments マニアック。。。

また少し便利になった!

New Write Operation Protocol

write concernの辺りのアップデート。結構重要

Ordered Operations
処理順を保障し、失敗があった時点で以降の処理を中止する。
Write operation: A => B => C => D
Bが失敗した場合、C , Dはキャンセル
結果、Aだけが反映。
Unordered Operations
順序性は無い。失敗があったオペレーションだけが影響を受ける
Write operation: A => B => C => D
Bが失敗した場合、Bだけが影響を受ける
結果、A,C,Dが反映。

MSI Package for MongoDB Available for Windows

どうでもいい

Security Improvements

SSLが使えるようになった。
以上。

が、、多くのDBと同じく、DBはDMZ以降にあるべきで、SSL化してスループットが落ちるのは許容できん。

mecabでのユーザ辞書でハマった話

コストは単純に足し込むと思ってたのだけど、遷移コストなんてものがあるのね。。
日本テレビ東京で学ぶMeCabのコスト計算

しかし困ったぞ、、cost 0 でユーザ辞書に登録しても採用されない問題!

どんな事が起きるかというと、、

形態素解析の例としては良くないが。。)

山形、山形県、山形産、山形県産、切り落とし 
みたいなユーザ辞書を作ったとして、

山形県産牛モモ切り落とし』

みたいな単語を形態素解析した場合

当然、
山形県産 牛 モモ 切り落とし

と期待したい所だが

山形 県 産 牛 モモ 切り 落とし

みたいな結果になり得る。。
これを防ぐには、それぞれの単語に適切なコストを振らなきゃならないが、辛すぎる。。という話。。。

なんか良い方法がないだろうか。。。

MongoDB vs MySQL性能比較

MongoDB Aggregation FWシリーズの最後
- Aggregation FW機能、SQLとの比較
- Aggregation FWの特徴と地雷
- (今回)MongoDB vs MySQL性能比較

Aggregation FWについては、大体、把握している情報を吐き出したと思う。

MongoDBのRDBMSライクな機能について性能を比較してみた。

その前に。。

NoSQL

基本的には、RDBMSから機能を削り、別の部分に特化することで
ハイパフォーマンスを実現しながらも実用に耐える品質に仕上げたプロダクトである。

MongoDB vs Other NoSQL

MongoDBはNoSQLの中では低速な部類に入る。

これは他のNoSQLに比べて豊富な機能が提供されているからでRDBMSからJOINを除いた相当の機能』と言っても良いくらいの豊富さだ。部分的にはRDBMSを凌駕するような機能すらある。

MongoDB vs RDBMS

RDBMSとMongoDBの関係もやはり同じで、全体的に見てRDBMSの方が機能が豊富だ。
その分、性能にも差が出て当然だ。

基本的に、、

RDBMS
システム全体の基本バックエンド
MongoDB
システムの中の数機能(性能とある程度の機能が欲しい場所)のバックエンド
極端な話、Solrなんかと同じ扱いでよいと思っている。
格闘技に例えると。。
大半のNoSQL
ボクシング
MongoDB
キックボクシング
RDBMS
総合

こんな感じかな。

性能比較

MongoDB単体での色々性能比較はコチラ

条件
環境
SAKURA VPS3G
取り扱うデータ
4KB(11column) x 1000万件 = 40GB
MongoDB
2.4.4
MySQL
5.5.30
クエリー条件
msql/mongo コマンドから直接実行(構文解析コスト含む)
インデックス
検索クエリーはプライマリーキーで特定できるものを使用

計測結果

MongoDB(s) CPU InnoDB(s) CPU MyISAM(s) CPU
insert 1157 80% 3534 65% 1880 55%
range fetch 30 5% 1962 70% 1777 90%
range count 3 - 452 100% 3 -
group 235 65% 439 110% 241 60%

詳細は後述

総評

全体的にMongoDBとMyISAMのデータ構造や実装は似ているように見える。
特にCOUNTのカーソル舐めや、GROUP BYの全データ舐めなどは、性能が似通っている。
単純な使い方をする場合はMongoDBかMyISAMを選択すると良さそう。


よく言われるように、InsertはInnoDBよりMyISAMの方が遥かに早い。
MongoDBは更に早いがこれはドキュメントDBは一塊のデータ(structure)をそのまま書くだけなので納得。


一番はっきりしているのが範囲検索の速度だ。
単純な用途で、かつ、範囲検索がしたい場合はMongoDBはお勧めである。

以下、計測の詳細

INSERT

1000万行

200行単位でINSERT

INSERT INTO TEST VALUES
(0,0,0,0,"aaaaaaaaaa","bbbbbbbbbbbbbbbbbbbb","cccccccccccccccccccccccccccccc","dddddddddddddddddddddddddddddddddddddddddddddddddd","eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",0,"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"),
(1,1,1,1,"aaaaaaaaaa","bbbbbbbbbbbbbbbbbbbb","cccccccccccccccccccccccccccccc","dddddddddddddddddddddddddddddddddddddddddddddddddd","eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",1,"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH")
  :
(199,199,199,199,"aaaaaaaaaa","bbbbbbbbbbbbbbbbbbbb","cccccccccccccccccccccccccccccc","dddddddddddddddddddddddddddddddddddddddddddddddddd","eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",199,"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH");
INSERT INTO TEST VALUES
(200,200,...),
 :
 :
(9999999,9999999,...);

mongoimportで投入。JSONパースのコストが高くmongoimport側のCPU使用率が非常に高くなる。

{ "_id" : 0, "value0" : 0, "value1" : 0, "value2" : 0, "value3" : "aaaaaaaaaa", "value4" : "bbbbbbbbbbbbbbbbbbbb", "value5" : "cccccccccccccccccccccccccccccc", "value6" : "dddddddddddddddddddddddddddddddddddddddddddddddddd", "value7" : "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "value8" : 0, "value9" : "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH" }
{ "_id" : 1, "value0" : 1, "value1" : 1, "value2" : 1, "value3" : "aaaaaaaaaa", "value4" : "bbbbbbbbbbbbbbbbbbbb", "value5" : "cccccccccccccccccccccccccccccc", "value6" : "dddddddddddddddddddddddddddddddddddddddddddddddddd", "value7" : "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "value8" : 1, "value9" : "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH" }
 :
{ "_id" : 9999999, ... }

JSONコストをスキップする為に、CSVを読んで、C++ driverから直接BSONを作ってやると若干早くなるが
微々たるモノでクライアント側のCPU負荷が下がるだけなので、わざわざ結果を書かなかった。

BSONObj obj =  BSON(
  "_id" << i <<
                    "value0" << v0 <<
                    "value1" << v1 <<
                    "value2" << v2 <<
                    "value3" << v3 <<
                    "value4" << v4 <<
                    "value5" << v5 <<
                    "value6" << v6 <<
                    "value7" << v7 <<
                    "value8" << v8 <<
                    "value9" << v9);
conn.insert( ns ,obj);

SELECT(範囲)

1000 queries

正直、PRIMARYキーのBETWEENがこんな差がつくとは思わなかった。。。

SELECT * FROM TEST WHERE id BETWEEN 0 AND 9999;
SELECT * FROM TEST WHERE id BETWEEN 10000 AND 19999;
  :
SELECT * FROM TEST WHERE id BETWEEN 9990000 AND 9999999;

MongoDBの範囲検索は超はやい!

db.TEST.find({_id:{$gte:0,$lt:10000}});
db.TEST.find({_id:{$gte:10000,$lt:20000}});
  :
db.TEST.find({_id:{$gte:9990000,$lt:10000000}});

COUNT(範囲)

1000 queries

PRIMARYキーの範囲検索+カウントでは、MyISAMが顕著に早い。
明らかにインデックスだけで処理が完結している速度。

SELECT COUNT(*) FROM TEST WHERE id BETWEEN 0 AND 9999;
SELECT COUNT(*) FROM TEST WHERE id BETWEEN 10000 AND 19999;
  :
SELECT COUNT(*) FROM TEST WHERE id BETWEEN 9990000 AND 9999999;

明らかにCovered Index & カーソールの両端判定の恩恵を受けている。
これは予想通り。むしろMyISAMが同等の速度を出している方が驚き。

db.TEST.find({_id:{$gte:0,$lt:10000}}).count();
db.TEST.find({_id:{$gte:10000,$lt:20000}}).count();
  :
db.TEST.find({_id:{$gte:9990000,$lt:10000000}}).count();

GROUP

(4000group x 2500)

これもMyISAMが超健闘。早い!!
MyISAMのデータ構造がスパースな情報にアクセスするクエリーに向いている模様。

SELECT value2, COUNT(id) FROM TEST GROUP BY value2 ORDER BY value2;

Aggregation FWも中々早い。が、、コンテキストのサイズに注意。
クエリーで消費するメモリー総量と結果サイズが引っかかり所。。

db.TEST.aggregate([
 {$group: { _id:"$value2", count: {$sum:1 }}},
 {$sort: {_id:1} }
]);