MySQL按字符串hash分区_MySQL学习笔记(14):分区
本文更新于2019-06-30,使用MySQL 5.7,操作系統(tǒng)為Deepin 15.4。
分區(qū)類型
可以使用SHOW PLUGINS查看是否安裝了分區(qū)插件。
MySQL創(chuàng)建分區(qū)表支持使用大部分存儲(chǔ)引擎,但不支持使用MERGE或CSV存儲(chǔ)引擎。同一個(gè)分區(qū)表的所有分區(qū)必須使用同一種存儲(chǔ)引擎。
MySQL分區(qū)作用于整個(gè)表的所有數(shù)據(jù)和索引,其索引一定是本地LOCAL索引。
無論那種分區(qū)類型,要么分區(qū)表上沒有主鍵/唯一鍵,要么分區(qū)表的主鍵/唯一鍵包含分區(qū)鍵。
分區(qū)表中的分區(qū)名不區(qū)分大小寫。
可以通過查詢information_schema.PARTITIONS得知分區(qū)中的行數(shù),來間接確定記錄是插入到那一個(gè)分區(qū)中的:
SELECT PARTITION_NAME, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = dbname AND TABLE_NAME = tablename
Range分區(qū)
CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY RANGE [COLUMNS] (partitionkey[, ...]) (
PARTITION partitionname VALUES LESS THAN (value)|MAXVALUE
[, ...]
)
如不使用COLUMNS,則Range分區(qū)的分區(qū)鍵必需為INT類型的某一列,或某一返回INT類型的表達(dá)式。如使用COLUMNS,則為Range Columns分區(qū),分區(qū)鍵可為非INT類型,可為多列分區(qū),不能為表達(dá)式。
Range分區(qū)的區(qū)間必須連續(xù)且不能互相重疊,區(qū)間為左閉右開區(qū)間。每個(gè)分區(qū)都是按順序進(jìn)行定義的,從最低到最高。
分區(qū)鍵的值如果是NULL則會(huì)被當(dāng)作最小值來處理。
List分區(qū)
CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY LIST [COLUMNS] (partitionkey[, ...]) (
PARTITION partitionname VALUES IN (value[, ...])
[, ...]
)
如不使用COLUMNS,List分區(qū)的分區(qū)鍵必需為INT類型的某一列,或某一返回INT類型的表達(dá)式。如使用COLUMNS,則為L(zhǎng)ist Columns分區(qū),分區(qū)鍵可為非INT類型,可為多列分區(qū),不能為表達(dá)式。
List分區(qū)的聲明不必按照特定的順序。
分區(qū)鍵的值如果是NULL則必須出現(xiàn)在分區(qū)定義的枚舉列表中。
Columns分區(qū)
Columns分區(qū)可分為Range Columns分區(qū)和List Columns分區(qū),其分區(qū)鍵都支持整數(shù)、日期時(shí)間、字符串?dāng)?shù)據(jù)類型。
所有整數(shù)類型,即TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,不支持其他數(shù)值類型。
日期時(shí)間類型DATE和DATETIME。分區(qū)日期處理支持的函數(shù)有YEAR()、TO_DAYS()、TO_SECONDS()。
字符串類型CHAR、VARCHAR、BINARY、VARBINARY,不支持[*]TEXT和[*]BLOB。
Columns分區(qū)可使用一列或多列作為分區(qū)鍵,即支持多列分區(qū),不支持表達(dá)式作為分區(qū)鍵。其分區(qū)鍵是基于元組的比較,即多列排序。
Hash分區(qū)
CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY [LINEAR] HASH(partitionkey)
PARTITIONS count
MySQL支持兩種Hash分區(qū),常規(guī)Hash分區(qū)和線性Hash分區(qū)。常規(guī)Hash分區(qū)使用的是取模算法,線性Hash分區(qū)使用的是一個(gè)線性的2的冪的運(yùn)算法則。常規(guī)Hash分區(qū)在分區(qū)管理(增加、刪除、合并、拆分分區(qū))時(shí)代價(jià)較大,線程Hash分區(qū)在分區(qū)管理時(shí)能處理得更迅速,但各個(gè)分區(qū)之間數(shù)據(jù)分布不太均勻。常規(guī)Hash分區(qū)將記錄保存到分區(qū)編號(hào)為MOD(partitionkey, count)的分區(qū)中,線性Hash分區(qū)保存的分區(qū)編號(hào)按照如下規(guī)則計(jì)算。當(dāng)線性Hash分區(qū)的個(gè)數(shù)為2的冪的時(shí)候,其和常規(guī)Hash分區(qū)的分區(qū)結(jié)果是一致的。
找到下一個(gè)大于等于count的2的冪V = Power(2, Ceiling(Log(2, count))),V有可能大于count。
設(shè)置N = partitionkey & (V - 1)。由上一步得,V - 1為一個(gè)所有位都為1的整數(shù),運(yùn)算結(jié)果N共有V種可能(0至V - 1)。
當(dāng)N > count時(shí),設(shè)置V = Ceiling(V / 2),由第一步得知該值肯定小于count且為一個(gè)2的冪。使用新的V設(shè)置N = N & (V - 1)即為分區(qū)編號(hào)。
Hash分區(qū)的分區(qū)鍵必需為INT類型的某一列,或某一返回INT類型的表達(dá)式。
分區(qū)鍵的值如果是NULL則會(huì)將其當(dāng)作零值處理。
Key分區(qū)
CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY [LINEAR] KEY ([partitionkey[, ...]])
PARTITIONS count
Key分區(qū)的分區(qū)鍵可為除[*]TEXT和[*]BLOB類型以外的一列或多列,不能為表達(dá)式。如未指定分區(qū)鍵,則使用主鍵作為分區(qū)鍵;若無主鍵,則選擇非空唯一鍵作為分區(qū)鍵。MySQL使用服務(wù)器的HASH函數(shù)計(jì)算列的散列值。
分區(qū)鍵的值如果是NULL則會(huì)將其當(dāng)作零值處理。
Key分區(qū)表不能執(zhí)行ALTER TABLE DROP PRIMARY KEY來刪除主鍵,否則會(huì)返回錯(cuò)誤:Field in list of fields for partition function not found in table。
Key分區(qū)使用LINEAR和Hash分區(qū)有相同的作用。
子分區(qū)
Range分區(qū)和List分區(qū)可再進(jìn)行子分區(qū)(復(fù)合分區(qū)),子分區(qū)可以使用Hash分區(qū)或Key分區(qū)。
CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY RANGE|LIST [COLUMNS] (partitionkey1[, ...])
SUBPARTITION BY HASH|KEY (partitionkey2[, ...])
SUBPARTITIONS count
(
PARTITION partitionname VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}
[, ...]
)
PARTITION子句的VALUES根據(jù)分區(qū)是Range分區(qū)還是List分區(qū)填寫(下同)。
分區(qū)管理
Range分區(qū)和List分區(qū)的分區(qū)管理
刪除分區(qū),會(huì)同時(shí)刪除分區(qū)中的數(shù)據(jù):
ALTER TABLE tablename
DROP PARTITION partitionname
增加分區(qū),Range分區(qū)只能添加分區(qū)至分區(qū)列表最大一端:
ALTER TABLE tablename
ADD PARTITION (
PARTITION partitionname VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}
)
重定義分區(qū),不會(huì)丟失原有數(shù)據(jù),可以用來拆分一個(gè)分區(qū)為多個(gè)分區(qū),也可以用來合并多個(gè)相鄰分區(qū)(指定義語句相鄰)為一個(gè)分區(qū)或多個(gè)分區(qū),同時(shí)重定義的分區(qū)范圍必需與原分區(qū)相同:
ALTER TABLE tablename
REORGANIZE PARTITION partitionname1[, ...] INTO (
PARTITION partitionname2 VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}
[, ...]
)
如不使用相鄰分區(qū)重定義,則會(huì)返回錯(cuò)誤:When reorganizing a set of partitions they must be in consecutive order。
Hash分區(qū)和Key分區(qū)的分區(qū)管理
合并分區(qū):
ALTER TABLE tablename
COALESCE PARTITION count
不能通過加大count值來增加分區(qū)的數(shù)量,否則會(huì)返回錯(cuò)誤:Cannot remove all partitions, use DROP TABLE instead!。
增加分區(qū),為新增count個(gè)分區(qū),而不是增加到count個(gè)分區(qū):
ALTER TABLE tablename
ADD PARTITION PARTITIONS count
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的MySQL按字符串hash分区_MySQL学习笔记(14):分区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 密码学计算_python
- 下一篇: sqlserver两个日期之间的年数_S