簡體   English   中英

在無主鍵列上分區 mysql 表

[英]partition mysql table on a none primary key column

我有一張桌子:

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

其中列類型為:

  • id(bigint 不是 null 主鍵自動增量)
  • 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  |
+----+---------+----------+

等等。

確保您已滿足何時使用分區的標准。 這是一個相當罕見的情況,需要 map 與您的查詢密切相關。 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)
);

參考: 小提琴

是的,由於user_id不是表primary key(s)unique keys的一部分,因此您不能單獨為表上的user_id創建分區,因為DOC非常清楚地說明了這一點

表上的每個唯一鍵都必須使用表分區表達式中的每一列

因此,對於您的情況,您可以做的是在您的表上為iduser_id添加一個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)
);

注意由於您已經有一個包含值的表來定義分區范圍,因此您需要環繞分區中user_id列的所有現有值。 也就是說,如果您的user_id1000 ,則無法將最后一個分區定義為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)
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM