一些建议。
您可能要对这些东西运行聚合查询,因此在将数据加载到表中之后(或同时),您应该预先聚合数据,例如按小时或按用户预先计算总计,或者按周,无论如何,您会得到这个想法,并将其存储在您用于报告图表的缓存表中。如果您可以将数据集缩小一个数量级,那么对您有好处!
这意味着我将使用时间戳每隔一段时间抓取一些数据。
所以这意味着您只使用过去 X 天的数据?
如果要删除几千万行,从表中删除旧数据可能会非常缓慢,分区非常适合(只需删除那个旧分区)。它还将同一时间段的所有记录在磁盘上紧密地组合在一起,因此缓存效率更高。
现在,如果您使用 MySQL,我强烈建议您使用 MyISAM 表。你没有防崩溃或事务和锁定是愚蠢的,但表的大小比 InnoDB 小得多,这意味着它可以放入 RAM,这意味着访问速度更快。
由于大型聚合可能涉及大量相当连续的磁盘 IO,因此像 RAID10(或 SSD)这样的快速 IO 系统是一个优势。
是否有优化表或查询以便您可以执行这些查询
在合理的时间内?
这取决于表和查询;如果不了解更多信息,无法提供任何建议。
如果您需要具有大聚合和连接的复杂报告查询,请记住 MySQL 不支持任何花哨的 JOIN、散列聚合或其他任何真正有用的东西,基本上它唯一能做的就是嵌套循环索引扫描,它是在缓存表上很好,如果涉及到一些随机访问,在其他情况下绝对很糟糕。
我建议您使用 Postgres 进行测试。对于大型聚合,更智能的优化器确实可以很好地工作。
例子:
CREATE TABLE t (id INTEGER PRIMARY KEY AUTO_INCREMENT, category INT NOT NULL, counter INT NOT NULL) ENGINE=MyISAM;
INSERT INTO t (category, counter) SELECT n%10, n&255 FROM serie;
(系列包含 16M 行,n = 1 .. 16000000)
MySQL Postgres
58 s 100s INSERT
75s 51s CREATE INDEX on (category,id) (useless)
9.3s 5s SELECT category, sum(counter) FROM t GROUP BY category;
1.7s 0.5s SELECT category, sum(counter) FROM t WHERE id>15000000 GROUP BY category;
在像这样的简单查询中,pg 大约快 2-3 倍(如果涉及复杂的连接,差异会更大)。