日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql非整型分区_mysql分区

發(fā)布時間:2023/12/14 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql非整型分区_mysql分区 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

mysql分區(qū)的優(yōu)點:

1、和單個磁盤或者文件系統(tǒng)分區(qū)相比,可以儲存更多的數(shù)據(jù)。

2、優(yōu)化查詢,在where字句中包含分區(qū)條件時,可以只掃描必要的一個或多個分區(qū)來提高查詢效率;同時在涉及sum()和count()這類聚合函數(shù)查詢的時候,可以容易的在每個分區(qū)上并行處理,最終只需要匯總所有分區(qū)得到的結(jié)果。

3、對于已過期或不需要保存的文件,可以通過刪除與這些數(shù)據(jù)有關(guān)的分區(qū)來快速的刪除數(shù)據(jù)。

4、跨多個磁盤分散數(shù)據(jù)查詢,以獲得更大的查詢吞吐量。

mysql5.6以后的版本通過一下命令查詢當(dāng)前mysql是否支持分區(qū)。(該查詢會顯示所有插件,去查找partition插件對應(yīng)的信息)

show plugins;

Mysql支持使用大部分存儲引擎(比如 myisam,innodb,memory等存儲引擎)創(chuàng)建分區(qū)表;Mysql不支持使用MERGE或是CSV存儲引擎來創(chuàng)建分區(qū)表;同一個分區(qū)表的所有分區(qū)必須使用同一個存儲引擎,不同的分區(qū)表可以使用不同的存儲引擎。

mysql分區(qū)的類型:

1、range分區(qū)2、lsit分區(qū)3、hash分區(qū)4、key分區(qū)

5、colunms分區(qū)(5.5引入的分區(qū)類型)

注:mysql5.1開始支持分區(qū)的功能,5.1中range、list、hash分區(qū)都要求分區(qū)鍵都是int類型,也就是5.1僅僅支持整數(shù)分區(qū)。唯一例外的就是key分區(qū),可以使用其他類型的列(blob或text列類型除外)作為分區(qū)鍵;5.5以上版本已支持非整數(shù)的range、list分區(qū)了

無論是那種分區(qū),要么分區(qū)表上沒有主鍵/唯一鍵,要么分區(qū)表的主鍵/唯一鍵必須包含分區(qū),也就是說不能使用主鍵/唯一鍵字段外的其他字段分區(qū)(分區(qū)字段必須是主鍵)

mysql命名是大小寫敏感的,但是對于分區(qū)的命名大小寫確是不敏感的。例如,創(chuàng)建分區(qū)時使用下面語句就會報錯,因為它認(rèn)為下面的分區(qū)名一致而導(dǎo)致分區(qū)名重復(fù)。

partition mypart values in (1,3,5),

partition MyPart values in (2,4,6)

一、range分區(qū)

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作為主鍵來創(chuàng)建表的話,那么就會報錯: a primary key must include all columns in the table's partitioning function。(這是問題針對對所有分區(qū)類型);

按照這個分區(qū)方案,當(dāng)store_id大于等于30的時候,數(shù)據(jù)就會插入失敗,因為mysql不知道該把數(shù)據(jù)插入到哪個磁盤分區(qū)下。

這個時候就需要用到下面語句

alter table temp addpartition (

partition p3valuesless than maxvalue

);

range分區(qū)中,分區(qū)鍵如果是null值就會被當(dāng)做一個最小值來處理。

非整數(shù)分區(qū),5.5后支持,提供了range columns 分區(qū)來支持非整數(shù)分區(qū),例如字段中有一些字段類型創(chuàng)建日期create_time,這樣創(chuàng)建日期時候就不需要通過函數(shù)進(jìn)行轉(zhuǎn)換。

partition byrange columns (create_time) (

partition p0values less than ('19940813'),

partition p1values less than ('20120101'),

partition p2values less than ('20180101')

);

日期處理的函數(shù)還有year(),to_days(),to_seconds()--把日期轉(zhuǎn)化成秒。

刪除分區(qū):

alter table temp drop partition p0; #刪除p0分區(qū)的數(shù)據(jù)

經(jīng)常運(yùn)用分區(qū)查詢,可以很快的確定只有某一個或某些分區(qū)需要掃描,例如檢索商店id大于25的記錄,只需要掃描p2分區(qū)即可。

explain partition select count(1) from temp where store_id>=25;

二、list分區(qū)

list分區(qū)建立在離散的值列告訴數(shù)據(jù)庫指定的值屬于哪個分區(qū),list分區(qū)在很多方面類似range分區(qū)

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后支持非整數(shù)分區(qū)

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分區(qū)

columns是在mysql5.5引入的分區(qū)類型,是為了解決mysql5.5版本之前只支持非整型分區(qū),從而需要通過額外的函數(shù)計算得到整型或者通過額外的轉(zhuǎn)換表來轉(zhuǎn)換為整數(shù)在分區(qū)的問題。columns可以細(xì)分為range columns分區(qū)和list columns分區(qū)。range columns和list columns分區(qū)都支持整數(shù)、日期時間、字符串三大類型數(shù)據(jù)。

1、所有整數(shù)類型:tinyint 、smallint、mediumint、int和bigint;其他數(shù)值類型都不支持,例如不支持decimal和float;2、日期時間類型:date和datetime;3、字符類型:char、varchar、binary和varbinary;不支持text和blob類型作為分區(qū)鍵;

columns分區(qū)的亮點除了支持?jǐn)?shù)據(jù)類型增加以外,另外一大亮點就是columns分區(qū)還支持多列分區(qū)。

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分區(qū)

hash分區(qū)主要是用分散熱點讀,確保數(shù)據(jù)在預(yù)算確定個數(shù)的分區(qū)中盡可能平均分布,mysql支持兩種分區(qū),常規(guī)HASH分區(qū)、線性HASH分區(qū)(LINEAR HASH分區(qū));常規(guī)hash使用的是取模算法。線性hash分區(qū)使用的是一個線性的2的冪的運(yùn)算法則。

下面創(chuàng)建一個常規(guī)hash分區(qū)的散列表emp,使用partition by partitions hash(expr) partitions num,對分區(qū)類型、分區(qū)鍵和分區(qū)個數(shù)進(jìn)行定義。其中expr是某列值或一個基于某列值返回的一個整數(shù)值的表達(dá)式,num是一個非負(fù)的整數(shù),標(biāo)識分隔成分區(qū)的數(shù)量,某人num為1。

下面創(chuàng)建一個基于store_id列hash分區(qū)的表,表被分成了4個分區(qū)。

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;

對于一個表達(dá)式expr,我們可以計算出它將會保存到那個分區(qū)。將要保存的分區(qū)編號為N,N=MOD(expr,num)。所以下面記錄中我們可以發(fā)現(xiàn)將會保存到那個分區(qū)中

insert into emp values (1,'tom','2010-10-10','9999-12-31','cleck',234);

根據(jù)上面的公示就可以發(fā)現(xiàn)N=MOD(234,4)#取模,求余#,結(jié)果為2。所以被分配到第二分區(qū)。

'expr'可以是mysql中有效的任何函數(shù)或其他表達(dá)式,只要他們返回一個即非常也非隨機(jī)數(shù)的整數(shù)。只是每當(dāng)插入/更新/刪除一行數(shù)據(jù)時,這個表達(dá)式都需要運(yùn)算一次,這就意味著非常復(fù)雜的表達(dá)式可能會引起性能問題。mysql也不推薦使用涉及多列的哈希表達(dá)式。

常規(guī)的hash分區(qū)的方式通過取模的方式使數(shù)據(jù)盡可能分配到每個分區(qū)中,讓每個分區(qū)中的數(shù)據(jù)都減少,從而提高查詢的效率;可能當(dāng)我們需要新增分區(qū)或者合并分區(qū)的時候,問題就會出現(xiàn)了。假設(shè)原來是5個常規(guī)分區(qū),現(xiàn)在新增為6個。取模算法由原來的mod(exp,5)變成了mod(exp,6)。原來5個分區(qū)中的數(shù)據(jù)大部分需要從新通過從新計算從新分區(qū)。所以常規(guī)的hash分區(qū)在分區(qū)管理上帶來的代價太大了,不適合需要靈活變動分區(qū)的需求。

所以為了降低管理分區(qū)上的代價,mysql提供了線性分區(qū),分區(qū)函數(shù)是一個線性的2的幕運(yùn)算。

線性hash分區(qū)和常規(guī)hash分區(qū)在語法上唯一的區(qū)別就是在partition by 字句中添加 linear 關(guān)鍵字,例如:

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分區(qū)的優(yōu)點是,在分區(qū)維護(hù)(包含新增、刪除、合并、拆分分區(qū))時,mysql能夠處理得更加迅速;缺點是,對比常規(guī)hash分區(qū)(取模)的時候,線性hash各個分區(qū)之間數(shù)據(jù)的分布不太平衡。

五、key分區(qū)

4,key分區(qū)

key分區(qū)和hash分區(qū)的區(qū)別:

1)hash分區(qū)允許用戶自定義的表達(dá)式,而key分區(qū)不允許使用用戶自定義的表達(dá)式。

2)hash分區(qū)只支持整數(shù)分區(qū),key分區(qū)支持除了blob或text類型之外的其他數(shù)據(jù)類型分區(qū)。

3)與hash分區(qū)不同,創(chuàng)建key分區(qū)表的時候,可以不指定分區(qū)鍵,默認(rèn)會選擇使用主鍵/唯一鍵作為分區(qū)鍵,沒有主鍵/唯一鍵,必須指定分區(qū)鍵。

在KEY分區(qū)中使用關(guān)鍵字LINEAR和在HASH分區(qū)中使用具有同樣的作用,分區(qū)的編號是通過2的冪(powers-of-two)算法得到,而不是通過模數(shù)算法

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;

總結(jié)

以上是生活随笔為你收集整理的mysql非整型分区_mysql分区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。