我正在开发一个社交网络类型项目,就像大多数社交网络一样,用户提要会显示您的朋友在网站上完成的事情。
因此,假设我有这些字段的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个月创建一个新分区,有没有办法自动化新分区?请帮忙
答案 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和成本。
有关分区的详细信息,请查看以下链接。