2
  • 我正在使用具有以下简单结构的 MySql 表:

    ID_A : 整数 8

    ID_B:整数 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?映射减少数据库?

谢谢你的帮助

4

2 回答 2

0

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

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

mongoDB groupBy 用于更大的分组操作

希望这可以帮助

于 2011-07-13T08:40:44.490 回答
0

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

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

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

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

于 2011-07-13T09:56:05.917 回答