mysql 分區說明
當 MySQL的總記錄數超過了100萬後,性能會大幅下降,可以采用分區方案
分區允許根據指定的規則,跨文件系統分配單個表的多個部分。表的不同部分在不同的位置被存儲為單獨的表。
1.先看下innodb的數據結構
(1)共享表空間的數據結構
1 |
create table t3(id int )engine innodb;
|
查看保存的文件t3.frm,ibdata1的文件,存放著所有的表額數據和索引
(2)獨立表空間的數據結構
1 |
create table t2(id int )engine innodb;
|
查看保存的文件
要對innodb進行分區操作,需要要設置innodb的表空間為獨立表空間
如果以前不是獨立表空間,在設置了innodb_file_per_table=1重啟mysql後,使用alter table table_name engine=innodb;修改為獨立表空間
2.分區的優勢:
(1)與單個磁盤或文件系統分區相比,可以存儲更多的數據
(2)很容易就能刪除不用或者過時的數據
(3)一些查詢可以得到極大的優化
(4)涉及到 SUM()/COUNT() 等聚合函數時,可以並行進行
(5)IO吞吐量更大
分區的限制
- 最大分區數目不能超過1024
- 如果含有唯一索引或者主鍵,則分區列必須包含在所有的唯一索引或者主鍵在內
- 不支持外鍵
- 不支持全文索引(fulltext)
3.查看mysql是否支持分區
1 |
SHOW VARIABLES LIKE ‘%partition%‘
|
或者用
1 |
SHOW PLUGINS;
|
4.分區類型
(1)RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。
(2)LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。
(3)HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包>含MySQL中有效的、產生非負整數值的任何表達式。
hash分區的目的是將數據均勻的分布到預先定義的各個分區中,保證各分區的數據量大致一致。
hash的分區函數頁需要返回一個整數值。partitions子句中的值是一個非負整數,不加的partitions子句的話,默認為分區數為1。
(4)KEY分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數。必須有一列或多列包含>整數值。
(5)columns分區
mysql-5.5開始支持COLUMNS分區,COLUMNS分區可以直接使用非整形數據進行分區。COLUMNS分區支持以下數據類型:
所有整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL則不支持。
日期類型,如DATE和DATETIME。其余日期類型不支持。
字符串類型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT類型不支持。
COLUMNS可以使用多個列進行分區。
eg:
1 2 3 4 5 |
create table t(
id int
)engine innodb
partition by hash(id)
partitions 4;
|
查看一個該表的文件結構
t表實現的分區,分成了4個分區
註:
HASH分區不能刪除分區,所以不能使用DROP PARTITION操作進行分區刪除操作
ALTER TABLE ... COALESCE PARTITION num來合並分區,num是減去的分區數量;
ALTER TABLE ... ADD PARTITION PARTITIONS num來增加分區,num是在原先基礎上再增加的分區數量
減去兩個分區後,數據根據現有的分區進行了重新的分布
1 |
ALTER TABLE t ADD PARTITION PARTITIONS 3;
|
1 |
ALTER TABLE t COALESCE PARTITION 3;
|
mysql 分區說明