繁体   English   中英

如何在MySQL中按日对MyISAM表进行分区

[英]How to partition a MyISAM table by day in MySQL

我想将最近45天的日志数据保留在MySQL表中,以进行统计报告。 每天可能有20-30百万行。 我计划创建一个平面文件,并每天使用加载数据infile来获取其中的数据。 理想情况下,我希望每天都在自己的分区上,而不必每天编写脚本来创建分区。

MySQL中是否有一种方法可以说每天自动获取自己的分区?

谢谢

嗯..,用组合键在Mod 45中对它们编号,并在它们之间循环...

认真地讲,每天1张桌子是一个有效的建议,由于它是静态数据,因此我将创建打包的MyISAM,具体取决于主机的排序能力。

建立查询以合并部分或全部查询只是一个中等挑战。

每天1张桌子,并对其进行分区以提高负载性能。

是的,您可以按日期对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)
);

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

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

MERGE存储或多或少是指向多个表的简单指针,并​​且可以在几秒钟内重做。 对于循环日志,它可能非常强大! 这是我要做的:

每天创建一张表,使用LOAD DATA as 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将自动获取正确的表,这些表可能会更快,更容易编写。

我强烈建议使用Redis或Cassandra而不是MySQL来存储高流量数据,例如日志。 然后,您可以整天流式传输而不是每天导入。

“ NoSQL”数据库的比较中,您可以阅读更多关于这两个的内容。

如果您坚持使用MySQL,我认为最简单的方法就是每天创建一个新表,例如logs_2011_01_13,然后将其全部加载到该表中。 这使得删除较早的日期非常容易,并且您还可以轻松地将不同的表移至不同的服务器上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM