2012-03-07 131 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