在 none 主键列上分区 mysql table

partition mysql table on a none primary key column

我有一个 table:

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

其中列类型是:

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

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

以此类推

确保您已满足何时使用分区的条件。这是一种相当罕见的情况,需要与您的查询密切相关。 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)
);

参考:fiddle

是的,因为 user_id 不是 table primary key(s)unique keys 的一部分,您不能单独为 user_id 创建分区table 正如 DOCs 所说的非常清楚

every unique key on the table must use every column in the table's partitioning expression

所以对于你的情况,你可以做的是在你的table上为id和[=13添加一个unique key =]

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)
);

注意 因为您已经有一个 table 和值来定义您的分区范围,您需要将 user_id 的所有现有值环绕起来分区中的列。也就是说,如果您有一个 1000user_id,您不能将最后一个分区定义为 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)
);