分區: 分區也是MySQL優化中的一個重要方式 將一個表中的數據和索引,分散到不同的文件中進行存儲 通常情況下,一個表,對應一組數據和索引文件,一個表的數據和索引集中存儲在這組文件中 當一個表出現了大量的記錄時,可以將其分佈到不同的數據和索引文件中進行存儲 Innodb來說,一個表對應多個ibd文件 ...
分區:
分區也是MySQL優化中的一個重要方式
將一個表中的數據和索引,分散到不同的文件中進行存儲
通常情況下,一個表,對應一組數據和索引文件,一個表的數據和索引集中存儲在這組文件中
當一個表出現了大量的記錄時,可以將其分佈到不同的數據和索引文件中進行存儲
Innodb來說,一個表對應多個ibd文件
MyISAM來說,一個表對應多個myi,myd文件
分佈之後,每個文件中包含的記錄數量顯著減少,保證單獨文件的執行效率
最常用的分區語法是:使用ID,將數據分佈到多個分區中
在設計表的時候使用partition選項完成分區,需要提供分區演算法和演算法參數,完成分區操作
create table [table-name]( id int unsigned auto_increment primary key, subject varchar(255), content text )charset utf8 engine innodb partition by hash(id) partitions 10 ;
正常的建表語句,最後一行表示利用ID欄位,使用HASH演算法,將數據分佈到十個分區內
建表成功之後,可以發現資料庫中雖然只是一張表,但是文件夾中會有十個ibd文件,一個frm文件(結構文件)和一個par文件(分區結構文件)
分區成功後:客戶端和以前沒有任何區別,只是伺服器端將數據分散到了不同的分區中存儲
當前例子,使用HASH演算法,利用ID值求餘的演算法,通過餘數將記錄分佈到某個分區中
HASH(ID)演算法,邏輯上表示將記錄均勻地分佈到不同的區域中,該演算法也是使用最廣最常用的演算法
適用於數據量很大但是沒有明顯的邏輯區分時,使用該演算法
MySQL提供了四種分區演算法:HASH演算法,KEY演算法,RANGE演算法,LIST演算法
HASH演算法:
上文講了,使用一個整數的值,將記錄分佈到分區中,採用求餘方案;
(哈希是一類演算法,使用某個輸入可以得到某個特定的輸出,相同輸入那麼輸出也相同)
KEY演算法:
和HASH演算法很像,是一個更加通用的HASH演算法
HASH中只能對整數求餘運算,而KEY演算法可以使用非整型欄位,輸入數據不一定是整數
我們進行分區的時候,可以不採用KEY(ID),而使用字元串KEY(username)
註意:分區要求必須是主鍵的一部分,這裡需要primary key(id,username),分區欄位一定是強檢索欄位
RANGE演算法:
一種條件分區演算法,將數據使用某種條件分散到不同的區中
範圍條件演算法,主要使用小於來實現條件
使用示例:利用文章的發佈時間,將文章分佈到不同的區域中:
create table articles( id ... subject ... content ... pubtime int, primary key (id,pubtime) )charset=utf8 engine=innodb partition by range(pubtime) ( partition p201710 values less than (1509465599), partition p201711 values less than (1512057599), partition p201712 values less than (1514735999) );
分為10月11月12月三個月,後邊的數字是時間戳,p201710是自己進行命名的
LIST演算法:
一種條件分區,條件使用IN
使用示例:文章狀態,1代表正在寫,2代表已保存,3代表發佈
create table articles( id ... subject ... content ... pubtime int, status tinyint, primary key (id,status) )charset=utf8 engine=innodb partition by list(status) ( partition writing values in (1,2), partition published values in (3) );
那麼這裡就將文章分為已發佈和未發佈兩個分區
分區的管理語法:
對於LIST和RANGE可以刪除和新增分區:
添加分區
alter table articles add partition( partition p201801 values less than (1517414400), partition p201802 values less than (1519833600) );
刪除分區,刪除分區後,分區的數據也會隨之刪除,不可恢復
alter table articles drop partition p201710;
對於HASH和KEY可以修改分區的數量:
在原有的基礎上再加四個分區,數據不丟失
alter table artiles add partiotion partitions 4;
合併為六個分區(註意語法中沒有partitions,而且數據不會丟失)
alter table articles coalesce partition 6;
加入和合併分區由於要保證數據不丟失,所以效率較低,時間較長
總結:
(1)分區是在客戶端程式不變的情況下,將伺服器端數據分佈到不同的物理文件中
(2)當數據表中數據量很大的時候,分區可以提升效率,只有檢索欄位為分區欄位的時候,分區效率才會比較明顯
(3)可以將分區文件部署到不同的磁碟上,充分利用磁碟的性能