1

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

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

推荐一个 NoSQL-Database 以提高查询性能的速度(范围查询、精确匹配查询以及它们的组合)。

MongoDB 似乎是将这些对象存储在单个集合中的一个不错的选择,不幸的是,MongoDB 每个集合最多只能索引 64 个属性,这意味着我也必须拆分对象值。MongoDB 也不提供加入集合服务器端的功能。

  1. 有人知道如何使用 dbref / 手动引用使用 MongoDB / Java“加入”多个集合吗?

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

要求:

  • 无需交易

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

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

4

3 回答 3

1

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

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

nosql 数据库

oriendb vs mongodb

于 2013-05-14T15:55:03.527 回答
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"
}
于 2013-05-14T14:53:10.867 回答
0

AerospikeDB 是一个很好的解决方案

它通常与数十亿个对象一起部署,因此 500M 不会是一个汗水

索引会很大,但索引的内存表示相当紧凑。索引的大小将取决于给定属性上单个索引值的选择性量。如果您知道选择性,您可以计算出避免分页的确切内存量,并且由于它是 SSD 优化的,您可以获得比 SSD 上的其他 NoSQL 数据库更好的性能。

存储这个数量的列效果很好,并且不需要内部连接。

http://aerospike.com/

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

于 2013-05-21T12:39:15.057 回答