我正在为MySQL寻找一个替代数据库(Engine = MyISAM)。
我的Java应用程序存储大型对象,每个对象具有250-300个属性。一个MySQL服务器上大约有5亿个对象。避免不必要的连接,它使用垂直分区,手动执行。有将近250个表用于存储属性值,这些表也被编入索引。当查询特定属性时,MySQL执行得很慢(查询5个属性意味着5个联接)。
建议使用NoSQL-数据库来提高查询性能的速度(范围查询、精确匹配查询以及它们的组合)。
MongoDB似乎是将这些对象存储在单个集合中的一个很好的替代方法,不幸的是,MongoDB只能为每个集合最多64个属性索引,这意味着我还必须拆分对象值。MongoDB也没有提供加入集合服务器端的功能。
要求:
发布于 2013-05-14 14:53:10
有64个索引的限制,但您可以执行如下操作。
在'attr‘数组中,您可以将250-300属性放在'attr’上,然后对‘attr’进行索引。然后您可以查询任何attr元素。
但让我提醒你,这个指数的大小将是巨大的。“attr”字段中的每个元素将有一个索引条目。但是您可以分析查询性能。
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"
}发布于 2013-05-14 15:55:03
发布于 2013-05-21 12:39:15
AerospikeDB是一个很好的解决方案。
它通常被部署在数十亿个物体上,所以5亿不会是汗水
索引将很大,但索引的内存表示形式相当紧凑.索引的大小将取决于给定属性上单个索引值的选择性。如果您知道选择性,就可以计算不分页的确切内存量,而且由于对SSD进行了优化,所以性能要比SSD上的其他NoSQL数据库要好得多。
存储此数量的列非常有效,并且不需要内部连接。
警告:我写了一部“飞机票”,但我还是喜欢它。
https://stackoverflow.com/questions/16545438
复制相似问题