mongoDB で timestamp のカラムを Binary(unixtime) にした場合と、ASCII 文字列とした場合とで、インデックスの大きさとか、クエリーのパフォーマンスが変わるのかと思って確認してみた。
登録データ
(Binary ケース)
mongodb> db.test11.findOne()
{
"h" : {
"t" : 1400000000,
"n" : "host0001",
"i" : "item0001"
},
"d" : [
{
"p" : "parameter0001",
"v" : 1.1
},
{
"p" : "parameter0002",
"v" : 2.2
},
{
"p" : "parameter0003",
"v" : 3.3
}
]
}
(ASCII ケース)
mongodb> db.test12.findOne()
{
"h" : {
"t" : "1400000000",
"n" : "host0001",
"i" : "item0001"
},
"d" : [
{
"p" : "parameter0001",
"v" : 1.1
},
{
"p" : "parameter0002",
"v" : 2.2
},
{
"p" : "parameter0003",
"v" : 3.3
}
]
}
クエリー
(Binary ケース)
mongodb> db.test11.find({'h.t':{'$gte':1400000000,'$lte':14000086400}}).explain()
(ASCII ケース)
mongodb> db.test12.find({'h.t':{'$gte':'1400080000','$lte':'1400082000'}}).explain()
結果
インデックスサイズ(MB)
データ数 | Binary ケース | ASCII ケース |
---|---|---|
1000000 | 24 | 26 |
2000000 | 47 | 53 |
10000000 | 239 | 268 |
クエリーのパフォーマンス(msec)
数回クエリーを発行して、Index, データがメモリに乗ったであろう状態から測定開始
query(1%)
データ数 | Binary ケース | ASCII ケース |
---|---|---|
1000000 | 0 | 0 |
2000000 | 1 | 1 |
10000000 | 73 | 65 |
query(2%)
データ数 | Binary ケース | ASCII ケース |
---|---|---|
1000000 | 1 | 1 |
2000000 | 2 | 2 |
10000000 | 145 | 133 |
query(5%)
データ数 | Binary ケース | ASCII ケース |
---|---|---|
1000000 | 3 | 3 |
2000000 | 7 | 6 |
10000000 | 357 | 323 |
気付き
インデックスサイズは、ASCII ケースの方が大
クエリーパフォーマンスは、ASCII ケースの方が数%-10数% よい
あくまで参考として。