2
  • 次の単純な構造のMySqlテーブルを使用しています。

    ID_A:int 8

    ID_B:int 8

    主キー:ID_A、ID_Bインデックス:ID_B

  • このMySQLテーブルには5億を超える行が含まれており、重みは20Goです。

  • 私はそれらの種類のクエリを実行できる必要があります:

    select *,count(*) as cpt from table group by ID_A order by cpt DESC
    
    select *,count(*) as cpt from table group by ID_B order by cpt DESC
    
    select * from table where ID_A in (1,2,3,4,5,5) 
    
    select * from table where ID_B in (1,2,3,4,5,5) 
    
    select *,count(*) as cpt from table where ID_B in (1,2,3,4,5) group by ID_A order by cpt DESC
    
    select *,count(*) as cpt from table where ID_A in (1,2,3,4,5) group by ID_B order by cpt DESC
    
  • innodbとMyIsamを試しましたが、大きな構成サーバーを使用しても、mysqlはGroupByクエリに応答できません。大量のメモリを消費するため、スクリプト側からも実行できません。

すべてのデータをRAMに収めることはできません(現在は20Goですが、近い将来は60Goになります)。

NoSqlデータベースを使用する必要がありますか?MongoDB?マップリデュースDB?

助けてくれてありがとう

4

2 に答える 2

0

大規模なデータに MongoDB を使用したことはありませんが、10,000 個を超えるキーの場合は、デフォルトの groupBy の代わりに mongoDB map/reduce を使用できます。

これに関する mongoDB のドキュメントは次のとおりです。

より大きなグループ化操作のためのmongoDB groupBy

これが役立つことを願っています

于 2011-07-13T08:40:44.490 に答える
0

select ,count( ) as cpt from table group by ID_A order by cpt DESC

エラー、それは解析されますが、プログラミング スタイルが非常に悪いため、何を返すかさえわかりません。

多くの同時実行性があり、負荷を複数のサーバーに分散できない限り (MySQL でも同様に実行できます)、NoSQL システムではそれほど高速にはならないのではないかと思います。したがって、リクエストを並列化するには、おそらくシャーディング/ map-reduce を検討する必要があります(これも複数のサーバーを意味します)。

奇妙な SQL はさておき、データを非正規化しないでください。ID_A および ID_B カウントのテーブルを追加し、既存のテーブルにトリガーを配置して、データを新しいテーブルに入力します。

于 2011-07-13T09:56:05.917 に答える