如何在此表上使用mysql分区?

时间:2011-03-02 00:29:38

标签: mysql partitioning

我正在开发一个社交网络类型项目,就像大多数社交网络一样,用户提要会显示您的朋友在网站上完成的事情。

因此,假设我有这些字段的MySQL表格;

// user_actions  
auto_id = auto increment ID  
type = a number (1 = photo upload, 2 = friend added, 3 = status post, 4 = so other action, etc..)  
user_id = The id of the user who did the action  
datetime = date and time  
action_id = this could be the ID of the action, so if it is for a status post, it could be the ID of the actual status  post record  

现在在我的PHP脚本中,我会查询此表以获取用户的所有朋友操作。

我认为这是使用MySQL分区的完美类型的表,因此不是显示来自您的朋友的所有操作,而是让它查询在网站上发布的每个操作,这可能是基于数百万条记录的以前的网站我做过,我认为分区再见日期会很好,可能会将所有操作分成6个月的分区,因此查询的记录较少。

我从未使用过分区,但是几年来一直在寻找与此类似的解决方案,我刚刚发现内置的MySQL分区,它们看起来就像这里的票。

有人可以告诉我如何在分区中创建这样的表,因为我需要每6个月创建一个新分区,有没有办法自动化新分区?请帮忙

1 个答案:

答案 0 :(得分:2)

这是未经测试的,但应该关闭。

CREATE TABLE user_actions (
    auto_id         INT NOT NULL AUTO_INCREMENT,
    type            INT NOT NULL,
    user_id         INT NOT NULL,
    insert_datetime DATE NOT NULL,
    action_id       INT NOT NULL) 
PARTITION BY RANGE(TO_DAYS(insert_datetime))
(
    PARTITION p0  VALUES LESS THAN (to_days('2011-06-01')),
    PARTITION p1  VALUES LESS THAN (to_days('2012-01-01')) ,
    PARTITION p11 VALUES LESS THAN MAXVALUE 
);

您可以通过以下方式进行管理:

您可以让MAXVALUE分区始终代表您的“活动”(在您的情况下是当前的6个月期间)分区。当周期结束时,您可以拆分/重新组合MAXVALUE分区,其中过去的时间段进入新分区,MAXVALUE分区再次表示当前/活动分区。

例如,2011年1月1日你将拥有一个分区,我们称之为pM,它将存储所有内容,因为它具有LESS THAN MAXVALUE子句。然后经过6个月后,您将重组/拆分该单个分区,创建一个新分区,其中包含前6个月的所有数据,MAXVALUE分区再次表示当前/活动期间。

-- Untested, but again should be close
ALTER TABLE t1 REORGANIZE PARTITION (pM) INTO
(PARTITION p20110101 VALUES LESS THAN (to_days('2011-07-01'), 
 PARTITION pM VALUES LESS THAN MAXVALUE); 

您也可以考虑进行子分区。您可以通过HASH对user_id进行子分区,从而进一步降低基于user_id的数据查询的I / O和成本。

有关分区的详细信息,请查看以下链接。

MySQL Partitioning

Partition Managment