2011-01-12 77 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將自動獲取正確的表,這些表可能會更快,更容易編寫。