什么是分表,從表面意思上看呢,就是把一張表分成N多個小表,具體請看mysql分表的3種方法
創(chuàng)新互聯(lián)建站主要從事網(wǎng)站設(shè)計制作、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)礦區(qū),十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
什么是分區(qū),分區(qū)呢就是把一張表的數(shù)據(jù)分成N多個區(qū)塊,這些區(qū)塊可以在同一個磁盤上,也可以在不同的磁盤上,具體請參考mysql分區(qū)功能詳細(xì)介紹,以及實例
二,mysql分表和分區(qū)有什么區(qū)別呢
1,實現(xiàn)方式上
a),mysql的分表是真正的分表,一張表分成很多表后,每一個小表都是完正的一張表,都對應(yīng)三個文件,一個.MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結(jié)構(gòu)文件。
Sql代碼
[root@BlackGhost test]# ls |grep user
alluser.MRG
alluser.frm
user1.MYD
user1.MYI
user1.frm
user2.MYD
user2.MYI
user2.frm
簡單說明一下,上面的分表呢是利用了merge存儲引擎(分表的一種),alluser是總表,下面有二個分表,user1,user2。他們二個都是獨立的表,取數(shù)據(jù)的時候,我們可以通過總表來取。這里總表是沒有.MYD,.MYI這二個文件的,也就是說,總表他不是一張表,沒有數(shù)據(jù),數(shù)據(jù)都放在分表里面。我們來看看.MRG到底是什么東西
Sql代碼
[root@BlackGhost test]# cat alluser.MRG |more
user1
user2
#INSERT_METHOD=LAST
從上面我們可以看出,alluser.MRG里面就存了一些分表的關(guān)系,以及插入數(shù)據(jù)的方式??梢园芽偙砝斫獬梢粋€外殼,或者是聯(lián)接池。
b),分區(qū)不一樣,一張大表進(jìn)行分區(qū)后,他還是一張表,不會變成二張表,但是他存放數(shù)據(jù)的區(qū)塊變多了。
Sql代碼
[root@BlackGhost test]# ls |grep aa
aa#P#p1.MYD
aa#P#p1.MYI
aa#P#p3.MYD
aa#P#p3.MYI
aa.frm
aa.par
從上面我們可以看出,aa這張表,分為二個區(qū),p1和p3,本來是三個區(qū),被我刪了一個區(qū)。我們都知道一張表對應(yīng)三個文件.MYD,.MYI,.frm。分區(qū)呢根據(jù)一定的規(guī)則把數(shù)據(jù)文件和索引文件進(jìn)行了分割,還多出了一個.par文件,打開.par文件后你可以看出他記錄了,這張表的分區(qū)信息,根分表中的.MRG有點像。分區(qū)后,還是一張,而不是多張表。
INNODB引擎只支持DATA DIRECTORY,不支持INDEX DIRECTORY, 另外 目錄要空目錄權(quán)限歸屬mysql 組mysql 用戶,命令
mkdir /data
chown mysql:mysql /data
主鍵必須包含分區(qū)字段,PRIMARY KEY (id,store_id)
CREATE TABLE orders_list2 (
id INT AUTO_INCREMENT,
customer_surname VARCHAR(30),
store_id INT,
salesperson_id INT,
order_date DATE,
note VARCHAR(500),
PRIMARY KEY (id,store_id),
INDEX idx (id)
) ENGINE = INNODB
PARTITION BY LIST(store_id) (
PARTITION p1
VALUES IN (1, 3, 4, 17)
DATA DIRECTORY = '/data/p1',
PARTITION p2
VALUES IN (2, 12, 14)
DATA DIRECTORY = '/data/p2',
PARTITION p3
VALUES IN (6, 8, 20)
DATA DIRECTORY = '/data/p3',
PARTITION p4
VALUES IN (5, 7, 9, 11, 16)
DATA DIRECTORY = '/data/p4',
PARTITION p5
VALUES IN (10, 13, 15, 18)
DATA DIRECTORY = '/data/p5'
);
分區(qū)表擴(kuò)充
ALTER TABLE orders_list2? ADD PARTITION (PARTITION p6 VALUES IN? (21,22,23)
DATA DIRECTORY = '/var/lib/mysql/monitor/orders/p6'? ;
子分區(qū)
CREATE TABLE tb_sub_dir (id INT, purchased DATE)
ENGINE='MYISAM'
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
? ? PARTITION p0 VALUES LESS THAN (1990)?
? ? (
? ? ? ? SUBPARTITION s0
? ? ? ? ? ? DATA DIRECTORY = '/data/data_sub1'
? ? ? ? ? ? INDEX DIRECTORY = '/data/idx_sub1',
? ? ? ? SUBPARTITION s1
? ? ? ? ? ? DATA DIRECTORY = '/data/data_sub1'
? ? ? ? ? ? INDEX DIRECTORY = '/data/idx_sub1'
? ? ),
? ? PARTITION p1 VALUES LESS THAN (2000)?
? ? (
? ? ? ? SUBPARTITION s2
? ? ? ? ? ? DATA DIRECTORY = '/data/data_sub2'
? ? ? ? ? ? INDEX DIRECTORY = '/data/idx_sub2',
? ? ? ? SUBPARTITION s3
? ? ? ? ? ? DATA DIRECTORY = '/data/data_sub2'
? ? ? ? ? ? INDEX DIRECTORY = '/data/idx_sub2'
? ? ),
? ? PARTITION p2 VALUES LESS THAN MAXVALUE?
? ? (
? ? ? ? SUBPARTITION s4
? ? ? ? ? ? DATA DIRECTORY = '/data/data_sub3'
? ? ? ? ? ? INDEX DIRECTORY = '/data/idx_sub3',
? ? ? ? SUBPARTITION s5
? ? ? ? ? ? DATA DIRECTORY = '/data/data_sub3'
? ? ? ? ? ? INDEX DIRECTORY = '/data/idx_sub3'
? ? )
);
日期字段區(qū)分
CREATE TABLE employees1 (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY RANGE ( YEAR(separated) ) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
當(dāng)分片索引不是純整型的字符串時,只接受整型的內(nèi)置 hash 算法是無法使用的。為此,stringhash 按照用戶定義的起點和終點去截取分片索引字段中的部分字符,根據(jù)當(dāng)中每個字符的二進(jìn)制 unicode 值換算出一個長整型數(shù)值,然后就直接調(diào)用內(nèi)置 hash 算法求解分片路由:先求模得到邏輯分片號,再根據(jù)邏輯分片號直接映射到物理分片。
用戶需要在 rule.xml 中定義 partitionLength[] 和 partitionCount[] 兩個數(shù)組和 hashSlice 二元組。
在 DBLE 的啟動階段,點乘兩個數(shù)組得到模數(shù),也是邏輯分片的數(shù)量
并且根據(jù)兩個數(shù)組的叉乘,得到各個邏輯分片到物理分片的映射表(物理分片數(shù)量由 partitionCount[] 數(shù)組的元素值之和)
此外根據(jù) hashSlice 二元組,約定把分片索引值中的第 4 字符到第 5 字符(字符串以 0 開始編號,編號 3 到編號 4 等于第 4 字符到第 5 字符)字符串用于 “字符串-整型”的轉(zhuǎn)換
在 DBLE 的運行過程中,用戶訪問使用這個算法的表時,WHERE 子句中的分片索引值會被提取出來,取當(dāng)中的第 4 個字符到第 5 字符,送入下一步
設(shè)置一個初始值為 0 的累計值,逐個取字符,把累計值乘以 31,再把這個字符的 unicode 值當(dāng)成長整型加入到累計值中,如此類推直至處理完截取出來的所有字符,此時的累計值就能夠代表用戶的分片索引值,完成了 “字符串-整型” 的轉(zhuǎn)換
對上一步的累計值進(jìn)行求模,得到邏輯分片號
再根據(jù)邏輯分片號,查映射表,直接得到物理分片號
與MyCat的類似分片算法對比
請點擊輸入圖片描述
兩種算法在string轉(zhuǎn)化為int之后,和 hash 分區(qū)算法相同,區(qū)別也繼承了 hash 算法的區(qū)別。
開發(fā)注意點
【分片索引】1. 必須是字符串
【分片索引】2. 最大物理分片配置方法是,讓 partitionCount[] 數(shù)組和等于 2880
例如:
property name="partitionLength"1/propertyproperty name="partitionCount"2880/property
或
property name="partitionLength"1,1/propertyproperty name="partitionCount"1440,1440/property
【分片索引】3. 最小物理分片配置方法是,讓 partitionCount[] 數(shù)組和等于 1
例如
property name="partitionLength"2880/propertyproperty name="partitionCount"1/property
【分片索引】4. partitionLength 和 partitionCount 被當(dāng)做兩個逗號分隔的一維數(shù)組,它們之間的點乘必須在 [1, 2880] 范圍內(nèi)
【分片索引】5. partitionLength 和 partitionCount 的配置對順序敏感
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
和
property name="partitionLength"256,512/propertyproperty name="partitionCount"2,1/property
是不同的分片結(jié)果
【分片索引】6. 分片索引字段長度小于用戶指定的截取長度時,截取長度會安全減少到符合分片索引字段長度
【數(shù)據(jù)分布】1. 分片索引字段截取越長則越有利于數(shù)據(jù)均勻分布
【數(shù)據(jù)分布】2. 分片索引字段的內(nèi)容重復(fù)率越低則越有利于數(shù)據(jù)均勻分布
運維注意點
【擴(kuò)容】1. 預(yù)先過量分片,并且不改變 partitionCount 和 partitionLength 點乘結(jié)果,也不改變截取設(shè)置 hashSlice 時,可以避免數(shù)據(jù)再平衡,只需進(jìn)行涉及數(shù)據(jù)的遷移
【擴(kuò)容】2. 若需要改變 partitionCount 和 partitionLength 點乘結(jié)果或改變截取設(shè)置 hashSlice 時,需要數(shù)據(jù)再平衡
【縮容】1. 預(yù)先過量分片,并且不改變 partitionCount 和 partitionLength 點乘結(jié)果,也不改變截取設(shè)置 hashSlice 時,可以避免數(shù)據(jù)再平衡,只需進(jìn)行涉及數(shù)據(jù)的遷移
【縮容】2. 若需要改變 partitionCount 和 partitionLength 點乘結(jié)果或改變截取設(shè)置 hashSlice 時,需要數(shù)據(jù)再平衡
配置注意點
【配置項】1. 在 rule.xml 中,可配置項為?property name="partitionLength"? 、property name="partitionCount" 和 property name="hashSlice"
【配置項】2.在 rule.xml 中配置 property name="partitionLength"?標(biāo)簽
內(nèi)容形式為:物理分片持有的虛擬分片數(shù)[,物理分片持有的虛擬分片數(shù),...物理分片持有的虛擬分片數(shù)]
物理分片持有的虛擬分片數(shù)必須是整型,物理分片持有的虛擬分片數(shù)從左到右與同順序的物理分片數(shù)對應(yīng),partitionLength 和partitionCount 的點乘結(jié)果必須在 [1, 2880] 范圍內(nèi)
【配置項】3. 在 rule.xml 中配置 property name="partitionCount"?標(biāo)簽
內(nèi)容形式為:物理分片數(shù)[,物理分片數(shù),...物理分片數(shù)]
其中物理分片數(shù)必須是整型,物理分片數(shù)按從左到右的順序與同順序的物理分片持有的虛擬分片數(shù)對應(yīng),物理分片的編號從左到右連續(xù)遞進(jìn),partitionLength 和 partitionCount 的點乘結(jié)果必須在 [1, 2880] 范圍內(nèi)
【配置項】4. partitionLength 和 partitionCount 的語義是:持有partitionLength[i] 個虛擬分片的物理分片有 partitionCount[i] 個
例如
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
語義是持有 512 個邏輯分片的物理分片有 1 個,緊隨其后,持有 256 個邏輯分片的物理分片有 2 個
【配置項】5.partitionLength 和 partitionCount 都對書寫順序敏感,
例如
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
分片結(jié)果是第一個物理分片持有頭512個邏輯分片,第二個物理分片持有緊接著的256個邏輯分片,第三個物理分片持有最后256個邏輯分片,相對的
property name="partitionLength"256,512/propertyproperty name="partitionCount"2,1/property
分片結(jié)果則是第一個物理分片持有頭 256 個邏輯分片,第二個物理分片持有緊接著的 256 個邏輯分片,第三個物理分片持有最后 512 個邏輯分片
【配置項】6.partitionLength[] 的元素全部為 1 時,這時候partitionCount 數(shù)組和等于 partitionLength 和 partitionCount 的點乘,物理分片和邏輯分片就會一一對應(yīng),該分片算法等效于直接取余
【配置項】7.在 rule.xml 中配置標(biāo)簽,從分片索引字段的第幾個字符開始截取到第幾個字符:
若希望從首字符開始截取 k 個字符( k 為正整數(shù)),配置的內(nèi)容形式可以為“ 0 : k ”、“ k ”或“ : k ”;
若希望從末字符開始截取 k 個字符( k 為正整數(shù)),則配置的內(nèi)容形式可以為“ -k : 0 ”、“ -k ”或“ -k : ”;
若希望從頭第 m 個字符起算截取 n 個字符( m 和 n 都是正整數(shù)),則先計算出 i = m - 1 和 j = i + n - 1,配置的內(nèi)容形式為“ i : j ”;
若希望從尾第 m 個字符起算截取從尾算起的 n 個字符( m 和 n 都是正整數(shù)),則先計算出 i = -m + n - 1,配置的內(nèi)容形式可以為“ -m : i ”;
若希望不截取,則配置的內(nèi)容形式可以為“ 0 : 0 ”、“ 0 : ”、“ : 0 ”或 “ : ”
1.添加PRIMARY KEY(主鍵索引)
mysqlALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysqlALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysqlALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
本文標(biāo)題:mysql分區(qū)怎么實現(xiàn) mysql分區(qū)的數(shù)據(jù)類型
瀏覽路徑:http://jinyejixie.com/article6/dopsiig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站策劃、App開發(fā)、企業(yè)建站、網(wǎng)站制作、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)