1. 程式人生 > >Mysql給現有表分割槽遇到的問題

Mysql給現有表分割槽遇到的問題

一、需要注意的問題:

1、分割槽的欄位必須是主鍵

2、不可以建立兩個主鍵,只能建立複合主鍵,所以要將原來的主鍵刪除再建立新的複合主鍵

3、要刪除原來的主鍵必須要先刪除對應欄位上的自增

二、操作步驟

1、刪除自增:

alter table shop modify shop_id int(11) not null;

2、刪除主鍵:

alter table shop drop primary key;   

3、新增複合主鍵:

alter table shop add primary key(shop_id,class_id); 

4、修改回自增:

alter table shop modify shop_id int(11) not null  auto_increment ;

5、新增分割槽:

alter table shop partition by list (class_id) ( 
partition c1 values in (1), 
partition c2 values in (2),
partition c3 values in (3), 
partition c4 values in (4), 
partition c5 values in (5) 
);

三、檢視分割槽結果:

mysql> show create table shop;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| shop  | CREATE TABLE `shop` (
  `shop_id` int(11) NOT NULL AUTO_INCREMENT,
  `class_id` int(11) NOT NULL DEFAULT '0',
  `shop_name` varchar(30) DEFAULT NULL,
  `shop_img` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`shop_id`,`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY LIST (class_id)
(PARTITION c1 VALUES IN (1) ENGINE = InnoDB,
 PARTITION c2 VALUES IN (2) ENGINE = InnoDB,
 PARTITION c3 VALUES IN (3) ENGINE = InnoDB,
 PARTITION c4 VALUES IN (4) ENGINE = InnoDB,
 PARTITION c5 VALUES IN (5) ENGINE = InnoDB) */ |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> explain partitions select * from shop where class_id=1 and shop_id=1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------------+------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref         | rows | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------------+------+-------+
|  1 | SIMPLE      | shop  | c1         | const | PRIMARY       | PRIMARY | 8       | const,const |    1 |       |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------------+------+-------+
1 row in set (0.00 sec)

四、擴充套件

1、將分割槽錶轉換為普通表

alter table shop remove partitioning;

2、刪除某個分割槽

alter table shop drop partition c3;

五、建議

直接定位到某個分割槽表上,如果查詢是按照分割槽的邏輯來的,減小I/O壓力,提升效能,側重於片狀範圍。

表非常大以至於無法全部都放在記憶體中,或者只在表的最後部分有熱點資料,其他都是歷史資料

對於那些已經失去儲存意義的資料,通常可以通過刪除與那些資料有關的分割槽,很容易地刪除那些資料。相反地,在某些情況下,新增新資料的過程又可以通過為那些新資料專門增加一個新的分割槽,來很方便地實現。

與單個磁碟或檔案系統分割槽相比,可以儲存更多的資料。

一些查詢可以得到極大的優化,這主要是藉助於滿足一個給定WHERE語句的資料可以只儲存在一個或多個分割槽內,這樣 在查詢時就不用查詢其他剩餘的分割槽。因為分割槽可以在建立了分割槽表後進行修改,所以在第一次配置分割槽方案時還不曾這麼做時,可以重新組織資料,來提高那些常用查詢的效率。

涉及到例如SUM()和COUNT()這樣聚合函式的查詢,可以很容易地進行並行處理。通過“並行”,這意味著該查詢可以在每個分割槽上同時進行,最終結果只需通過總計所有分割槽得到的結果。

通過跨多個磁碟來分散資料查詢,來獲得更大的查詢吞吐量。