磁區:
磁區也是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)可以將磁區檔案部署到不同的磁盤上,充分利用磁盤的性能
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/72707.html
標籤:MySQL
上一篇:MySQL 慢查詢日志
