【问题标题】:NoSQL Recommendation for a specific need针对特定需求的 NoSQL 建议
【发布时间】:2011-10-04 07:00:05
【问题描述】:
  • 我正在使用具有以下简单结构的 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?映射减少数据库?

感谢您的帮助

【问题讨论】:

    标签: mysql nosql bigdata


    【解决方案1】:

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

    你可以在这里找到 mongoDB 文档:

    mongoDB groupBy for larger grouping operation

    希望对你有帮助

    【讨论】:

    • 谢谢。我将对这个文档进行循环,但我想知道 MongoDb 是否是这种简单数据结构的最佳解决方案。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的回答。 err, that will parse - but its very bad programming style, I'm not even sure what it will return. 获取 group by 行数的最佳方法是什么?关于非规范化,您的意思是在表更新时使用 MySql 触发器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2013-01-10
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多