针对特定需求的NoSQL建议

时间:2011-07-13 08:09:53

标签: mysql nosql bigdata

  • 我正在使用具有以下简单结构的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也无法回答Group By查询。我甚至不能从脚本方面做到这一点,因为它会耗费大量内存。

所有数据都不适合RAM(今天20Go,但不久的将来60Go)。

我们应该使用NoSql数据库吗? MongoDB?地图减少DB?

谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

我从未将MongoDB用于大数据,但是对于10,000多个密钥,您可以使用mongoDB map / reduce而不是默认的groupBy。

您可以在此处找到mongoDB文档:

mongoDB groupBy for larger grouping operation

希望这可以提供帮助

答案 1 :(得分:0)

  

选择,通过cpt DESC按ID_A顺序从表组计数cpt(

错误,这将解析 - 但它非常糟糕的编程风格,我甚至不确定它会返回什么。

我怀疑它在NoSQL系统上的速度不会快得多,除非你有很多并发性并且可以在多个服务器上分配负载(你可以用MySQL同样做)。因此,您可能需要查看分片/ map-reduce以并行化请求(再次暗示多个服务器)。

不考虑奇怪的SQL,为什么不对数据进行非规范化 - 为ID_A和ID_B计数添加表,然后在现有表上放置一个触发器,将数据填充到新表中。