在 none 主键列上分区 mysql table
partition mysql table on a none primary key column
我有一个 table:
+----+---------+----------+
| id | user_id | comment |
+----+---------+----------+
其中列类型是:
- id (bigint not null 主键自增)
- user_id(bigint 不为空)
- 评论(文字)
如何按范围对 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
的所有现有值环绕起来分区中的列。也就是说,如果您有一个 1000
的 user_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)
);
我有一个 table:
+----+---------+----------+
| id | user_id | comment |
+----+---------+----------+
其中列类型是:
- id (bigint not null 主键自增)
- user_id(bigint 不为空)
- 评论(文字)
如何按范围对 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
的所有现有值环绕起来分区中的列。也就是说,如果您有一个 1000
的 user_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)
);