mysql - 如何在该表上使用 mysql 分区?

标签 mysql partitioning

我正在开发一个社交网络类型的项目,就像大多数社交网络一样,它的用户源将显示您的 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 Partitioning

Partition Managment

关于mysql - 如何在该表上使用 mysql 分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5162099/

相关文章:

带有子分区的 MySQL ALTER TABLE 失败

database - 创建分区使用本地时区的时间戳 [Oracle 11g]

MySQL全文查询返回错误,索引已创建

mysql - 需要帮助在多个列上使用 UNIQUE 键

database - mysql 5.1 分区 - 我必须删除索引/键元素吗?

apache-kafka - Kafka Streams - 如何更好地控制内部创建的状态存储主题的分区?

mysql - SQL 分区表 - 如何将不需要分区的数据插入到分区表中?

mysql - #1064 - 你的 SQL 语法有错误;

Mysql如何进行左连接、分组并仅计算唯一的左列行

java - 输入流不起作用