0

我有一张桌子:

+----+---------+----------+
| id | user_id | comment  |
+----+---------+----------+

其中列类型为:

  • id(bigint 非空主键自增)
  • user_id(bigint 不为空)
  • 评论(文字)

如何user_id按范围分区此表?我试图在 PHPMyAdmin 中按范围对该表进行分区,但不允许我这样做,因为user_id它不是主键。如果我有很多 100 亿用户并且每个用户都有无限量的评论,那么这个表将会非常大。我想像这样分区它:

partition 1 (user_id<500)
+----+---------+----------+
| id | user_id | comment  |
+----+---------+----------+
partition 2 (user_id<1000)
+----+---------+----------+
| id | user_id | comment  |
+----+---------+----------+

等等。

4

2 回答 2

1

确保您已满足何时使用分区的标准。这是一种相当罕见的情况,需要密切映射到您的查询。500 个用户范围似乎很小。MySQL 可以在没有分区的情况下处理大型表,因此不要假设它是必要的。

表格是:

CREATE TABLE tbl (
id bigint unsigned AUTO_INCREMENT NOT NULL,
user_id bigint unsigned NOT NULL,
COMMENT TEXT NOT NULL,
PRIMARY KEY (user_id, id),
key(id))
PARTITION BY RANGE (user_id) (
  PARTITION p0 VALUES LESS THAN (500),
  PARTITION p1 VALUES LESS THAN (1000),
  PARTITION p2 VALUES LESS THAN (2000),
  PARTITION p3  VALUES LESS THAN (3000)
);

参考:小提琴

于 2020-07-26T01:51:34.260 回答
0

是的,因为user_id它不是表的一部分,primary key(s)或者unique keys您不能单独为user_id您的表创建分区,因为DOC非常清楚地说明了这一点

表上的每个唯一键都必须使用表分区表达式中的每一列

所以对于你的情况,你可以做的是unique key在你的桌子上id添加一个user_id

alter table myTable add unique key uk_id_userid (id, user_id);

然后只为列添加范围分区,user_id如下所示:

alter table myTable partition by range (user_id) (
    PARTITION p0 VALUES LESS THAN (10),
    PARTITION p1 VALUES LESS THAN (20),
    PARTITION p2 VALUES LESS THAN (30),
    PARTITION p3 VALUES LESS THAN (40)
);

注意由于您已经有一个包含值的表来定义分区范围,因此您需要环绕user_id分区中列的所有现有值。也就是说,如果你有一个user_id不能1000定义你的最后一个分区,PARTITION p3 VALUES LESS THAN (1000)那将会失败。您将需要一个分区,即:PARTITION p3 VALUES LESS THAN (2000)PARTITION p3 VALUES LESS THAN MAXVALUE

看到它在这里工作:http ://sqlfiddle.com/#!9/8ca7ed

完整的工作示例:

create table myTable (
   id bigint not null auto_increment,
   user_id bigint not null,
   comment text,
   key (id)
) engine=InnoDb;

insert into myTable (user_id, comment) values 
   (1, 'bla'), (1, 'ble'), (1, 'bli'), (1, 'blo'), 
   (12, 'bla'), (12, 'ble'), (12, 'bli'), (12, 'blo'), 
   (23, 'bla'), (23, 'ble'), (23, 'bli'), (23, 'blo'), 
   (34, 'bla'), (34, 'ble'), (34, 'bli'), (34, 'blo');

alter table myTable add unique key uk_id_userid (id, user_id);

alter table myTable partition by range (user_id) (
    PARTITION p0 VALUES LESS THAN (10),
    PARTITION p1 VALUES LESS THAN (20),
    PARTITION p2 VALUES LESS THAN (30),
    PARTITION p3 VALUES LESS THAN (40)
);
于 2020-07-26T01:54:42.723 回答