我正在寻找MySQL的替代数据库(Engine = MyISAM)。
我的Java应用程序存储大型对象,每个对象具有250-300个属性。单个MySQL服务器上有大约5亿个对象。避免不必要的连接,它使用垂直分区,手动执行。有近250个用于存储属性值的表,这些表也被索引。查询特定属性时,MySQL执行缓慢(查询5个属性意味着5个连接)。
建议使用NoSQL-Database来提高查询性能的速度(范围查询,完全匹配查询及其组合)。
MongoDB似乎是将这些对象存储在单个集合中的一个很好的替代方法,遗憾的是,MongoDB每个集合最多只能索引64个属性,这意味着我也必须拆分对象值。 MongoDB也没有提供加入服务器端集合的功能。
有没有人知道如何使用dbref / manual参考使用MongoDB / Java“加入”多个集合?
如果没有,是否还有其他NoSQL数据库用于存储带有ca的大对象。 250个属性,如上所述?
要求:
无需交易
用户必须只查看他们查询的属性,而不是整个对象
单一数据库服务器环境。
答案 0 :(得分:1)
有64个索引的限制,但您可以执行以下操作。
在'attr'数组中,您可以放置250-300属性,然后在'attr'上编入索引。然后你可以查询任何attr元素。
但是让我提醒你,这个指数的规模将是巨大的。 “attr”字段中的每个元素都有1个索引条目。但您可以分析查询性能。
test:Mongo > db.abhi.insert({ name : 'abhi', attr : [ { attr1 : 'val1' }, { attr2 : 'val2'}, {attr3 : 'val3'} ]})
test:Mongo > db.abhi.ensureIndex({attr : 1})
test:Mongo > db.abhi.find({attr : {attr1 : 'val1'}}).explain()
{
"cursor" : "BtreeCursor attr_1",
"isMultiKey" : true,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"attr" : [
[
{
"attr1" : "val1"
},
{
"attr1" : "val1"
}
]
]
},
"server" : "bdvlpabhishekk:27017"
}
答案 1 :(得分:1)
答案 2 :(得分:0)
AerospikeDB是一个很好的解决方案
它通常部署有数十亿个物体,所以500M不会出汗
索引会很大,但索引的内存中表示相当紧凑。索引的大小取决于给定属性上各个索引值的选择性。如果你知道选择性,你就可以计算出不需要分页的确切内存量,而且由于它经过SSD优化,你可以获得比使用SSD上的其他NoSQL数据库更好的性能。
存储此列数非常有用,并且不需要在内部进行连接。
[警告:我写过Aerospike的一部分,但我仍然喜欢它]