1

MySQL (Engine = MyISAM) の代替データベースを探しています。

私の Java アプリケーションは、それぞれ 250 から 300 の属性を持つ大きなオブジェクトを格納します。1 つの MySQL サーバーには約 5 億のオブジェクトがあります。不要な結合を避け、手動で実行される垂直パーティションを使用します。属性値を格納するための約 250 のテーブルがあり、これらにもインデックスが付けられています。特定の属性をクエリする場合、MySQL のパフォーマンスが低下します (5 つの属性をクエリすると、5 つの結合を意味します)。

クエリのパフォーマンス (範囲クエリ、完全一致クエリ、およびそれらの組み合わせ) の速度を上げるために、NoSQL データベースをお勧めします。

MongoDB は、これらのオブジェクトを 1 つのコレクションに格納する代わりに使用できます。残念ながら、MongoDB はコレクションごとに最大 64 個の属性しかインデックス化できないため、オブジェクトの値も分割する必要があります。また、MongoDB は、サーバー側でコレクションに参加する機能も提供していません。

  1. dbref /手動参照を使用してMongoDB / Javaを使用して複数のコレクションを「結合」する方法を知っている人はいますか?

  2. いいえの場合、大きなオブジェクトを保存するための他の NoSQL データベースはありますか。上記のように、250の属性?

要件:

  • 取引不要

  • ユーザーは、オブジェクト全体ではなく、クエリした属性のみを表示する必要があります

  • 単一データベース サーバー環境。

4

3 に答える 3

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 に答える
1

私は個人的に OrientDB で作業 (および貢献) しましたが、多くの nosql があり、フィールド数に制限はありません。

詳細を確認できるウェブサイトをいくつか提案できます。

nosql データベース

oriendb 対 mongodb

于 2013-05-14T15:55:03.527 に答える