我正在开发一个社交网络类型的项目,就像大多数社交网络一样,它的用户源将显示您的 friend 在该网站上所做的事情。
假设我有一个包含这些字段的 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 分区的完美表类型,因此不必显示您 friend 的所有操作并让它查询网站上发布的每个操作,这些操作可能基于基于数据库的数百万条记录。我以前做过的网站,我认为最好对再见日期进行分区,也许将所有操作分为 6 个月的分区,这样查询的记录就更少了。
我从未使用过分区,但多年来一直在寻找与此类似的解决方案,我刚刚发现了内置的 MySQL 分区,它们看起来就像这里的票证。
有人可以告诉我如何在分区中创建这样的表,而且由于我需要每 6 个月创建一个新分区,有没有办法自动创建新分区?请帮忙
最佳答案
这未经测试,但应该很接近。
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 - 如何在该表上使用 mysql 分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5162099/