mysql非整型分区_mysql分区
mysql分區的優點:
1、和單個磁盤或者文件系統分區相比,可以儲存更多的數據。
2、優化查詢,在where字句中包含分區條件時,可以只掃描必要的一個或多個分區來提高查詢效率;同時在涉及sum()和count()這類聚合函數查詢的時候,可以容易的在每個分區上并行處理,最終只需要匯總所有分區得到的結果。
3、對于已過期或不需要保存的文件,可以通過刪除與這些數據有關的分區來快速的刪除數據。
4、跨多個磁盤分散數據查詢,以獲得更大的查詢吞吐量。
mysql5.6以后的版本通過一下命令查詢當前mysql是否支持分區。(該查詢會顯示所有插件,去查找partition插件對應的信息)
show plugins;
Mysql支持使用大部分存儲引擎(比如 myisam,innodb,memory等存儲引擎)創建分區表;Mysql不支持使用MERGE或是CSV存儲引擎來創建分區表;同一個分區表的所有分區必須使用同一個存儲引擎,不同的分區表可以使用不同的存儲引擎。
mysql分區的類型:
1、range分區2、lsit分區3、hash分區4、key分區
5、colunms分區(5.5引入的分區類型)
注:mysql5.1開始支持分區的功能,5.1中range、list、hash分區都要求分區鍵都是int類型,也就是5.1僅僅支持整數分區。唯一例外的就是key分區,可以使用其他類型的列(blob或text列類型除外)作為分區鍵;5.5以上版本已支持非整數的range、list分區了
無論是那種分區,要么分區表上沒有主鍵/唯一鍵,要么分區表的主鍵/唯一鍵必須包含分區,也就是說不能使用主鍵/唯一鍵字段外的其他字段分區(分區字段必須是主鍵)
mysql命名是大小寫敏感的,但是對于分區的命名大小寫確是不敏感的。例如,創建分區時使用下面語句就會報錯,因為它認為下面的分區名一致而導致分區名重復。
partition mypart values in (1,3,5),
partition MyPart values in (2,4,6)
一、range分區
create table temp(
idnot null,
enamevarchar(30),
jobvarchar(30),
store_idint not null)
partitionbyrange (store_id) (
partition p0values less than (10),
partition p1values less than (20),
partition p2values less than (30)
);
上述DDL語句中,如果將id作為主鍵來創建表的話,那么就會報錯: a primary key must include all columns in the table's partitioning function。(這是問題針對對所有分區類型);
按照這個分區方案,當store_id大于等于30的時候,數據就會插入失敗,因為mysql不知道該把數據插入到哪個磁盤分區下。
這個時候就需要用到下面語句
alter table temp addpartition (
partition p3valuesless than maxvalue
);
range分區中,分區鍵如果是null值就會被當做一個最小值來處理。
非整數分區,5.5后支持,提供了range columns 分區來支持非整數分區,例如字段中有一些字段類型創建日期create_time,這樣創建日期時候就不需要通過函數進行轉換。
partition byrange columns (create_time) (
partition p0values less than ('19940813'),
partition p1values less than ('20120101'),
partition p2values less than ('20180101')
);
日期處理的函數還有year(),to_days(),to_seconds()--把日期轉化成秒。
刪除分區:
alter table temp drop partition p0; #刪除p0分區的數據
經常運用分區查詢,可以很快的確定只有某一個或某些分區需要掃描,例如檢索商店id大于25的記錄,只需要掃描p2分區即可。
explain partition select count(1) from temp where store_id>=25;
二、list分區
list分區建立在離散的值列告訴數據庫指定的值屬于哪個分區,list分區在很多方面類似range分區
create tableexpenses(
expenses_date datenot null,
categoryint,
amountdecimal (10,3)
)
partitionbylist(category)(
partition p0values in (3,5),
partition p1values in (1,10),
partition p2values in (4,9),
partition p3values in (2)
);
5.5后支持非整數分區
create tableexpenses(
expense_date datenot null,
categoryvarchar(30),
amountdecimal (10,3)
)
partitionbylist columns (category) (
partition p0values in ('lodging','food'),
partition p1values in ('flights','ground transportation'),
partition p2values in ('leisure','customer entertainment')
);
三、columns分區
columns是在mysql5.5引入的分區類型,是為了解決mysql5.5版本之前只支持非整型分區,從而需要通過額外的函數計算得到整型或者通過額外的轉換表來轉換為整數在分區的問題。columns可以細分為range columns分區和list columns分區。range columns和list columns分區都支持整數、日期時間、字符串三大類型數據。
1、所有整數類型:tinyint 、smallint、mediumint、int和bigint;其他數值類型都不支持,例如不支持decimal和float;2、日期時間類型:date和datetime;3、字符類型:char、varchar、binary和varbinary;不支持text和blob類型作為分區鍵;
columns分區的亮點除了支持數據類型增加以外,另外一大亮點就是columns分區還支持多列分區。
create tablerc3(
aint,
bint)
partitionbyrange columns(a,b) (
partition p01values less than (0,10),
partition p02values less than (10,10),
partition p03values less than (10,20),
partition p04values less than (10,35),
partition p05values less than (10,maxvalue),
partition p06valuesless than (maxvalue,maxvalue)
);
四、hash分區
hash分區主要是用分散熱點讀,確保數據在預算確定個數的分區中盡可能平均分布,mysql支持兩種分區,常規HASH分區、線性HASH分區(LINEAR HASH分區);常規hash使用的是取模算法。線性hash分區使用的是一個線性的2的冪的運算法則。
下面創建一個常規hash分區的散列表emp,使用partition by partitions hash(expr) partitions num,對分區類型、分區鍵和分區個數進行定義。其中expr是某列值或一個基于某列值返回的一個整數值的表達式,num是一個非負的整數,標識分隔成分區的數量,某人num為1。
下面創建一個基于store_id列hash分區的表,表被分成了4個分區。
create tableemp (
idint not null,
enamevarchar(30),
hired datenot null default '1970-01-01',
separated datenot null default '9999-12-31',
jobvarchar(30) not null,
store_idint not null)
partitionby hash (store_id) partitions 4;
對于一個表達式expr,我們可以計算出它將會保存到那個分區。將要保存的分區編號為N,N=MOD(expr,num)。所以下面記錄中我們可以發現將會保存到那個分區中
insert into emp values (1,'tom','2010-10-10','9999-12-31','cleck',234);
根據上面的公示就可以發現N=MOD(234,4)#取模,求余#,結果為2。所以被分配到第二分區。
'expr'可以是mysql中有效的任何函數或其他表達式,只要他們返回一個即非常也非隨機數的整數。只是每當插入/更新/刪除一行數據時,這個表達式都需要運算一次,這就意味著非常復雜的表達式可能會引起性能問題。mysql也不推薦使用涉及多列的哈希表達式。
常規的hash分區的方式通過取模的方式使數據盡可能分配到每個分區中,讓每個分區中的數據都減少,從而提高查詢的效率;可能當我們需要新增分區或者合并分區的時候,問題就會出現了。假設原來是5個常規分區,現在新增為6個。取模算法由原來的mod(exp,5)變成了mod(exp,6)。原來5個分區中的數據大部分需要從新通過從新計算從新分區。所以常規的hash分區在分區管理上帶來的代價太大了,不適合需要靈活變動分區的需求。
所以為了降低管理分區上的代價,mysql提供了線性分區,分區函數是一個線性的2的幕運算。
線性hash分區和常規hash分區在語法上唯一的區別就是在partition by 字句中添加 linear 關鍵字,例如:
create tableemp (
idint not null,
enamevarchar(30),
hired datenot null default '1970-01-01',
separated datenot null default '9999-12-31',
jobvarchar(30) not null,
store_idint not null)
partitionby linear hash (store_id) partitions 4;
線性hash分區的優點是,在分區維護(包含新增、刪除、合并、拆分分區)時,mysql能夠處理得更加迅速;缺點是,對比常規hash分區(取模)的時候,線性hash各個分區之間數據的分布不太平衡。
五、key分區
4,key分區
key分區和hash分區的區別:
1)hash分區允許用戶自定義的表達式,而key分區不允許使用用戶自定義的表達式。
2)hash分區只支持整數分區,key分區支持除了blob或text類型之外的其他數據類型分區。
3)與hash分區不同,創建key分區表的時候,可以不指定分區鍵,默認會選擇使用主鍵/唯一鍵作為分區鍵,沒有主鍵/唯一鍵,必須指定分區鍵。
在KEY分區中使用關鍵字LINEAR和在HASH分區中使用具有同樣的作用,分區的編號是通過2的冪(powers-of-two)算法得到,而不是通過模數算法
CREATE TABLEemployees (
idINT NOT NULL,
first_nameVARCHAR(30),
last_nameVARCHAR(30),
store_idINT NOT NULL,
emailVARCHAR(30) NOT NULL,
create_time DATENOT NULL DEFAULT '9999-12-31',
)
PARTITIONBY LINEAR Key(email) PARTITIONS 4;
總結
以上是生活随笔為你收集整理的mysql非整型分区_mysql分区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上帝说:“首先,请叫我同志……”3
- 下一篇: 图形在计算机中用位图格式,位图、矢量图是