推荐使用NoSQL数据库来替换包含大对象和许多属性的MySQL数据库

时间:2013-05-14 14:08:25

标签: java mongodb performance-testing partitioning nosql

我正在寻找MySQL的替代数据库(Engine = MyISAM)。

我的Java应用程序存储大型对象,每个对象具有250-300个属性。单个MySQL服务器上有大约5亿个对象。避免不必要的连接,它使用垂直分区,手动执行。有近250个用于存储属性值的表,这些表也被索引。查询特定属性时,MySQL执行缓慢(查询5个属性意味着5个连接)。

建议使用NoSQL-Database来提高查询性能的速度(范围查询,完全匹配查询及其组合)。

MongoDB似乎是将这些对象存储在单个集合中的一个很好的替代方法,遗憾的是,MongoDB每个集合最多只能索引64个属性,这意味着我也必须拆分对象值。 MongoDB也没有提供加入服务器端集合的功能。

  1. 有没有人知道如何使用dbref / manual参考使用MongoDB / Java“加入”多个集合?

  2. 如果没有,是否还有其他NoSQL数据库用于存储带有ca的大对象。 250个属性,如上所述?

  3. 要求:

    • 无需交易

    • 用户必须只查看他们查询的属性,而不是整个对象

    • 单一数据库服务器环境。

3 个答案:

答案 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)

我个人与OrientDB一起工作(并且有所贡献)但是有很多nosql,他没有字段数限制

我可以推荐几个网站,了解更多信息:

nosql database

oriendb vs mongodb

答案 2 :(得分:0)

AerospikeDB是一个很好的解决方案

它通常部署有数十亿个物体,所以500M不会出汗

索引会很大,但索引的内存中表示相当紧凑。索引的大小取决于给定属性上各个索引值的选择性。如果你知道选择性,你就可以计算出不需要分页的确切内存量,而且由于它经过SSD优化,你可以获得比使用SSD上的其他NoSQL数据库更好的性能。

存储此列数非常有用,并且不需要在内部进行连接。

http://aerospike.com/

[警告:我写过Aerospike的一部分,但我仍然喜欢它]