2012-03-07 130 views
1

我來這裏找到很多次解決方案,幾乎總是找到一些適合我的完美答案。現在我終於決定寫下我的第一個問題。將表中的多個分區分區

也是我第一次使用分區掛載分區,但不是如此簡單的分區,這就是爲什麼我沒有在mysql官方文檔中找到任何解決方案。

我有這個表:

CREATE TABLE SystemEvents 
(
    ID int unsigned not null auto_increment primary key, 
    ReceivedAt datetime NULL, 
    DeviceReportedTime datetime NULL, 
    Facility smallint NULL, 
    Priority smallint NULL, 
    FromHost varchar(60) NULL, 
    Message text, 
    NTSeverity int NULL, 
    EventSource varchar(60), 
    EventUser varchar(60) NULL, 
    EventCategory int NULL, 
    EventID int NULL, 
    InfoUnitID int NULL , 
    SysLogTag varchar(60), 
    EventLogType varchar(60), 
) 

我需要通過 「FromHost」 鍵進行分區:

PARTITIOM BY LIST (FromHost) 
(
    PARTITION p01 VALUES IN ('server1'), 
    PARTITION p02 VALUES IN ('server2'), 
    PARTITION p03 VALUES IN ('server3', 'server4'), 
    PARTITION p04 VALUES IN less than maxvalue 
); 

直到這裏是一切OK。但是這裏出現了困難的部分:

一旦主表分區爲多個服務器,我需要按日期字段(receivedAt)將每個分區的內容分隔成子分區,如果它是可行的,則爲周。

原因是,數據庫必須存儲整個公司所有服務器的事件,「server1」和「server2」每個月都會創建近3萬行。我們需要的大多數查詢都是先由服務器完成,然後,一旦我們獲得了篩選出的選定服務器的事件列表,我們將按日期搜索,以查找我們正在查找的事件。

那麼,你可以指示我如何創建子分區到分區p01和p02的腳本,按receivedAt字段排序?

如果有什麼不明白的地方,請告訴我,我會改寫它。

非常感謝。

問候。 Xavidpr

回答

0

如果表具有主鍵,則用於分區的所有列都必須是主鍵的一部分。

其次,你想分區的FromHost這是一個varchar列。使用varchar限制可以使用的分區類型。此外,如果表格足夠大以保證分區,最好使用數字標識代替主機名稱。這會加快速度並減小桌子的尺寸。

一個直接的解決辦法是這樣的:

使用RANGE劃分爲partitioing的日期時間。 使用鍵或用於在主機分區散列分區(優選的整數HOST_ID)

由於不能使用於子分區RANGE,你將不得不通過RANGE和子分區由KEYHASH

分區換句話說分區由ReceivedAt和子分區由FromHost