我来这里寻找解决方案很多次,几乎总能找到一些适合我的回应。现在我终于决定写下我的第一个问题了。
也是我第一次使用分区挂载数据库而不是这么简单的分区,这就是我在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
);
直到这里一切都好。但是这里有困难的部分:
一旦主表被分区为多个服务器,我需要按日期字段(receivedAt)将每个分区的内容分成子分区,如果它是可行的,则需要一周。
原因是,数据库必须整年存储公司中所有服务器的事件,“server1”和“server2”每月创建近3百万行。我们需要的大多数查询首先是服务器,然后,一旦我们为选择的服务器过滤了事件列表,我们就按日期搜索,找到我们正在寻找的事件。
那么,你能指出我如何创建子分区到分区p01和p02的脚本,按receiveAt字段排序?
如果有什么不明白的地方,请告诉我,我会改写它。
非常感谢。
的问候。 Xavidpr
答案 0 :(得分:0)
如果表具有主键,则用于分区的所有列都必须是主键的一部分。
其次,您希望对作为varchar列的FromHost进行分区。使用varchar限制了您可以使用的分区类型。此外,如果表足够大以保证分区,最好使用主机的数字ID而不是主机名。这样可以加快速度并缩小表格大小。
直接的解决方案是:
在DateTime上使用RANGE
分区进行分区。
使用KEY或HASH分区在Host上进行分区(最好是整数host_id)
由于您无法在子分区上使用RANGE
,因此您必须按RANGE
进行分区,并按KEY
或HASH
进行分区
换句话说,按ReceivedAt
分区,按FromHost