表仅用于分组

时间:2017-11-16 15:33:19

标签: sql

为了在另一个表中对行进行分组,是否有一个包含单个列的表是常见的情况?

我正在批量插入数据,我希望每个批次都有一个自动增量密钥,以便能够根据生成的ID对数据进行分组。

具体而言,我想从中获取

A
id, x, y, b_id
id PRIMARY KEY
b_id FOREIGN KEY REFERENCES B.id

B
id, timestamp
id PRIMARY KEY

SELECT count(*) as number, B.timestamp FROM A inner join B on A.b_id=B.id
                     where A.x='value' and A.y='value'
                     group by B.id;

A
id, x, y, timestamp, b_id
id PRIMARY KEY
b_id FOREIGN KEY REFERENCES B.id

B
id
id PRIMARY KEY

SELECT count(*) as number, A.timestamp FROM A
                         where A.x='value' and A.y='value'
                         group by A.b_id, A.timestamp;

所以基本上将时间戳移动到B(非规范化)并仅使用外键进行分组。我想避免只加入B中的时间戳。表格相当大(60M行)并且连接速度很慢。如果我仍然在A上过滤并且只有外键用于分组,那么这会加速很多事情。

具体来说,我正在使用MySQL。

1 个答案:

答案 0 :(得分:0)

出于性能原因,非规范化是可以接受的。只需确保性能改进超过了非规范化的成本。不仅需要额外的空间需求(可能导致其自身的性能问题),而且还会产生潜在数据错误的成本。例如,当两行最终出现在表格中时#34; A"具有相同的b_id但不同的时间戳值。