如何在MySQL中按日划分MyISAM表

时间:2011-01-12 23:57:56

标签: mysql partitioning

我希望将最后45天的日志数据保存在MySQL表中,以便进行统计报告。每天可能有20-30万行。我打算创建一个平面文件,并使用load data infile每天获取数据。理想情况下,我希望每天都能拥有自己的分区,而无需每天编写脚本来创建分区。

在MySQL中有没有办法说每天都会自动获取自己的分区?

感谢

4 个答案:

答案 0 :(得分:1)

我强烈建议使用Redis或Cassandra而不是MySQL来存储高流量数据,例如日志。然后你可以整天流动它,而不是每天进口。

您可以在此comparison of "NoSQL" databases中详细了解这两个(以及更多)。

如果你坚持使用MySQL,我认为最简单的方法就是每天创建一个新表,比如logs_2011_01_13,然后将其全部加载到那里。它使得删除旧日期非常容易,您还可以轻松地在不同的服务器上移动不同的表。

答案 1 :(得分:0)

呃..,使用复合键在Mod 45中为它们编号并循环显示它们......

严重的是,每天1个表是一个有效的建议,因为它是静态数据,我会创建打包的MyISAM,具体取决于我的主机的排序能力。

构建查询以联合其中的部分或全部内容只会带来中等挑战。

每天1个表,并对其进行分区以提高负载性能。

答案 2 :(得分:0)

是的,您可以按日期对MySQL表进行分区:

CREATE TABLE ExampleTable (
  id INT AUTO_INCREMENT,
  d DATE,
  PRIMARY KEY (id, d)
) PARTITION BY RANGE COLUMNS(d) (
  PARTITION p1 VALUES LESS THAN ('2014-01-01'),
  PARTITION p2 VALUES LESS THAN ('2014-01-02'),
  PARTITION pN VALUES LESS THAN (MAXVALUE)
);

稍后,当您接近溢出到分区pN时,您可以拆分它:

ALTER TABLE ExampleTable REORGANIZE PARTITION pN INTO (
  PARTITION p3 VALUES LESS THAN ('2014-01-03'), 
  PARTITION pN VALUES LESS THAN (MAXVALUE)
);

这不会按日期自动分区,但您可以在需要时重新组织。最好在填充最后一个分区之前重新组织,这样操作就会很快。

答案 3 :(得分:0)

我在寻找其他东西时偶然发现了这个问题,并想指出MERGE存储引擎(http://dev.mysql.com/doc/refman/5.7/en/merge-storage-engine.html)。

MERGE存储或多或少是指向多个表的简单指针,可以在几秒钟内重做。对于自行车日志,它可以非常强大!这就是我要做的事情:

每天创建一个表,使用LOAD DATA作为提及的OP来填充它。完成后,删除MERGE表并重新创建它,包括新表,同时省略最旧的表。完成后,我可以删除/存档旧表。这将允许我快速查询特定日期或全部,因为原始表格和MERGE都有效。

CREATE TABLE logs_day_46 LIKE logs_day_45 ENGINE=MyISAM;
DROP TABLE IF EXISTS logs;
CREATE TABLE logs LIKE logs_day_46 ENGINE=MERGE UNION=(logs_day_2,[...],logs_day_46);
DROP TABLE logs_day_1;

请注意,MERGE表与PARTIONNED表不同,并提供一些优点和不便之处。但请记住,如果您尝试从所有表聚合,那么它将比所有数据仅在一个表中更慢(对于分区也是如此,因为它们基本上是不同的表)。如果您要在特定日期进行查询,则需要自己选择表,但如果在日值上完成分区,MySQL将自动获取可能更快更容易编写的正确表。