我设计的Mongodb系列可以保存每日音量的统计数据
这是我的数据库架构
mongos> db.arq.findOne()
{
"_id" : ObjectId("553b78637e6962c36d67c728"),
"ip" : NumberLong(635860665),
"ts" : ISODate("2015-04-25T00:00:00Z"),
"values" : {
"07" : 2,
"12" : 1
},
"daily_ct" : 5
}
mongos>
这是我的索引
mongos> db.arq.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "Query_Volume.test"
},
{
"v" : 1,
"key" : {
"ip" : 1
},
"name" : "ip_1",
"ns" : "Query_Volume.test"
},
{
"v" : 1,
"key" : {
"ts" : 1
},
"name" : "ts_1",
"expireAfterSeconds" : 15552000,
"ns" : "Query_Volume.test"
}
]
mongos>
注意:我有一个时间戳索引,因为我需要使用TTL机制。
但是Sharding Key有什么建议吗?
答案 0 :(得分:1)
您有多种选择:
{ts: 1}
您的时间戳。某些范围的数据将位于一起,但关键是单调递增,我不确定TTL索引是否会清理碎片块。意味着:写入负载从分片切换到分片,并且您有一个具有高写入负载的分片,而其他分片将不会对数据进行写入。如果您查询连续的时间范围但是在写作方面存在缺点,则此模式可以很好地工作。{ts: "hashed"}
基于哈希的分片。数据将在分片中或多或少地均匀分片。基于散列的分片会分配写入负载,但在查询数据时会涉及所有分片(或多或少)。您需要测试什么最适合您的读写操作。分片键取决于数据结构和应用程序的读/写模式。