我正在使用具有以下简单结构的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?
谢谢你的帮助
答案 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计数添加表,然后在现有表上放置一个触发器,将数据填充到新表中。