对于大量数据的简单分组查询,哪种数据库最有效?

raq*_*quo 5 sql postgresql group-by mongodb nosql

对于每个帐户,我有数百万个数据项(分析日志中的行),每个数据项都有 20-50 个数字属性(它们也可以为空)。我需要向他们展示统计数据,其中主要涉及诸如SELECT SUM(f1), f2, f3 WHERE f4>f5 GROUP BY f2, f3. 聚合函数有时比 SUM() 更复杂,而 GROUP BY 有时涉及 ROUND() 等简单函数。问题在于,此类查询是在用户界面中内置的,并且可以在这些属性的任意组合上运行(尽管当然有一些流行的组合)。

\n\n

一旦进入数据库,数据很可能不会被修改,而只会被读取。应该可以轻松地添加/删除属性 \xe2\x80\x93 ,在数据库术语中不一定是实时的,但它不应该像 MySQL 那样需要完整的表块。

\n\n

哪些 SQL 或 NoSQL 数据库最适合处理此类查询?我正在考虑 PostgreSQL 或 MongoDB,尽管在后者中,由于其局限性,我很可能不得不使用 MapReduce 而不是其 Group 功能。

\n\n

关于此类查询的性能还有其他建议吗?这听起来是否可行,或者我绝对必须要求用户预先定义他们想要运行的确切查询?

\n\n

任何想法将不胜感激。

\n

bti*_*lly 1

您想要什么查询性能?多久会被查询一次?

如果您对低分钟内的查询性能感到满意,并且查询率也同样较低,那么您可以使用关系表,其中主表用于数据项,连接表用于属性。请务必在组合(property_type、data_item_id、property_value)上的第二个表上放置组合索引,以保证良好的查询性能。您实际上并不需要其中的 property_value,但如果您拥有它,则查询可以以高效的方式从索引中提取数据,这将使连接变得非常非常容易。您可以使用任何关系数据库来执行此操作。我碰巧喜欢 P​​ostgreSQL,但 MySQL 也可以。(但在复杂查询上效率较低。)

如果您遵循此策略,那么您想要的每个属性都将要求您添加另一个连接。但连接将相当有效。