更新時(shí)間:2021-01-26 17:43:08 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽991次
分區(qū)是將一個(gè)表的數(shù)據(jù)按照某種方式,比如按照時(shí)間上的月份,分成多個(gè)較小的,更容易管理的部分,但是邏輯上仍是一個(gè)表。我們?cè)诖酥耙呀?jīng)講過(guò)MySQL分區(qū)表的原理,分區(qū)有利于管理非常大的表,它采用分而治之的邏輯,便于對(duì)數(shù)據(jù)的管理。本文我們就來(lái)進(jìn)一步了解MySQL分區(qū)表,詳細(xì)看一下MySQL分區(qū)表類型究竟有幾個(gè)?
MySQL支持多種分區(qū)表,我們看到最多的是根據(jù)范圍進(jìn)行分區(qū),每個(gè)分區(qū)存儲(chǔ)落在某個(gè)范圍的記錄,分區(qū)表達(dá)式可以是列,也可以是包含列的表達(dá)式。分區(qū)的一個(gè)主要目的是將數(shù)據(jù)按照一個(gè)較粗的粒度分在不同的表中,這樣做可以將相關(guān)數(shù)據(jù)存放在一起,另外,如果想一次批量刪除整個(gè)分區(qū)的數(shù)據(jù)也會(huì)變的很方便。實(shí)現(xiàn)分區(qū)表的代碼實(shí)際上是對(duì)一組底層表的句柄對(duì)象的封裝。對(duì)分區(qū)表的請(qǐng)求,都會(huì)通過(guò)句柄對(duì)象轉(zhuǎn)化成對(duì)存儲(chǔ)引擎的接口調(diào)用。
MySQL支持如下幾種類型的分區(qū):
1.RANGE分區(qū):行數(shù)據(jù)基于一個(gè)給定連續(xù)范圍分區(qū)。不好理解,看例子吧。5.5版本開始支持RANGE COLUMNS分區(qū)。
2.LIST分區(qū):同RANGE,區(qū)別在于給定的不是連續(xù)范圍,是離散的值。5.5版本開始支持LIST COLUMNS分區(qū)。
3.HASH分區(qū):根據(jù)用戶自定義的表達(dá)式的返回值進(jìn)行分區(qū),返回值不能是負(fù)數(shù)。
4.KEY分區(qū):根據(jù)MySQL內(nèi)部提供的哈希函數(shù)進(jìn)行分區(qū)。
5.COLUMNS分區(qū):5.5版本開始支持,可以直接使用非整形的數(shù)據(jù)進(jìn)行分區(qū),分區(qū)根據(jù)類型直接比較而得,不需要轉(zhuǎn)換為整形。
無(wú)論創(chuàng)建何種類型的分區(qū),如果表中存在主鍵或唯一索引的列,則分區(qū)列必須是主鍵或唯一索引的一部分。索引列可以是null值。在沒有主鍵和唯一索引的表中可以指定任意列為索引列。表中只能最多有一個(gè)唯一索引,即primary key 和unique key不能同時(shí)存在,primary key包含在unique key中時(shí)除外。
create table sales(
order_date datetime not null,
-- other columns omitted
) engine=innodb partition by range(year(order_date)) (
partition p_2010 values less than (2010),
partition p_2011 values less than (2011),
partition p_2012 values less than (2012),
partition p_catchall values less than maxvalue
);
partition分區(qū)子句中可以使用各種函數(shù),但有一個(gè)要求,表達(dá)式返回的值要是一個(gè)確定的整數(shù),且不能是一個(gè)常數(shù)。MySQL還支持鍵值,哈希和列表分區(qū),這其中有些還支持子分區(qū),不過(guò)我們?cè)谏a(chǎn)環(huán)境中很少見到。
我們還看到的一些其他的分區(qū)技術(shù)包括:
根據(jù)鍵值進(jìn)行分區(qū),來(lái)減少InnoDB的互斥競(jìng)爭(zhēng)。
使用數(shù)據(jù)模函數(shù)來(lái)進(jìn)行分區(qū),然后將數(shù)據(jù)輪詢放入不同的分區(qū)。
假設(shè)表有一個(gè)自增的主鍵列id,希望根據(jù)時(shí)間將最近的熱點(diǎn)數(shù)據(jù)集中存放,那么必須將時(shí)間戳包含在主鍵當(dāng)中才行,而這和主鍵本身的意義相矛盾,這種情況下可以使用這樣的分區(qū)表達(dá)式來(lái)實(shí)現(xiàn)相同的目的:Hash(id div 100000) ,這將為100萬(wàn)數(shù)據(jù)簡(jiǎn)歷一個(gè)分區(qū),這樣一方面實(shí)現(xiàn)了當(dāng)初的分區(qū)目的,另一方面比起使用時(shí)間范圍分區(qū)還避免了一個(gè)問題,就是當(dāng)超過(guò)一定閥值時(shí),如果使用時(shí)間范圍分區(qū)就必須新增分區(qū)。
當(dāng)然,分區(qū)技術(shù)的應(yīng)用遠(yuǎn)不止與此,區(qū)分各種分區(qū)表的類型并加以利用,我們才能更好地使用MySQL數(shù)據(jù)庫(kù)查詢和利用各種各樣的數(shù)據(jù)。本站的MySQL教程中,對(duì)mysql分區(qū)表有著十分詳細(xì)的講解,想要深入學(xué)習(xí)的小伙伴一定不要錯(cuò)過(guò)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743