2011-01-12 76 views
2

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

有没有在MySQL的方式,只是说每天自动获取它自己的分区?

感谢

回答

1

我会强烈建议使用Redis或卡桑德拉,而不是MySQL的存储高流量的数据,如日志。那么你可以整天流通,而不是每天进口。

您可以在此comparison of "NoSQL" databases了解更多关于这两个(及以上)。

如果你坚持的MySQL,我认为最简单的将只是每天创建一个新表,像logs_2011_01_13然后加载它都在那里。它使得更旧的日期非常容易,您还可以轻松地在不同的服务器上移动不同的表格。

+1

redis不支持ad hoc SQL查询,Cassandra对于2000万到3,000万行的矫枉过正而且不稳定。 – James 2011-01-13 00:45:25

0

呃......,它们编号在国防部45通过它们的复合键,循环...

认真,每天1台是一个有效的建议,并且由于它是静态的数据我会创造装的MyISAM,这取决于我的主人的排序能力。

向工会组织一些或全部建筑查询只会有一定的挑战性。

每天1张表格,并对这些表格进行分区以提高加载性能。

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) 
); 

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

0

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

合并存储或多或少一个简单的指针到多个表,并且可在数秒内重做。对于骑自行车日志,它可以是非常强大的!这里就是我想要做的:

每天创建一个表,使用LOAD DATA作为OP mentionned填满它。完成后,放弃MERGE表并重新创建,包括新表,而省略最旧的表。完成后,我可以删除/存档旧表格。这可以让我快速查询特定的一天,或者所有的ORIGINAL表和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将自动获取正确的表,这些表可能会更快,更容易编写。