Mysql高級(jí)特性系列,直接大廠面試

周末美好的閑暇時(shí)光,可大多人都在床上與之度過。怎么說呢? 時(shí)間這東西,只有你看到重,它才會(huì)有重量。但對(duì)應(yīng)煩惱也只有你知道! 所以今天開始新篇章分享---MySQL高級(jí)特性中的分區(qū)


特別通知:今天是母親節(jié)呀! 大家要記得這個(gè)神圣的日子


在這里,我吒吒輝得要報(bào)告下,因篇幅短小,無法融會(huì)貫通全部分享出來,故后面會(huì)推出詳細(xì)完整的內(nèi)容,所以得麻煩你關(guān)注下!?(^_-?


MySQL高級(jí)特性,那都是面試中常被考查。解決并發(fā)優(yōu)化問題,隸屬家常菜


這分區(qū)表是個(gè)啥?

分區(qū)表是一個(gè)獨(dú)立的邏輯表,底層由多個(gè)物理表組成。實(shí)現(xiàn)代碼實(shí)際是一組底層表的句柄對(duì)象。分區(qū)的一個(gè)主要目的是將大量的數(shù)據(jù)集按照一個(gè)較粗的粒度分散在不同的表中,從而減少每次查詢結(jié)果集的總量。


可能有人不清楚,這個(gè)表怎么存儲(chǔ)?句柄對(duì)象是什么東西?

如上,表數(shù)據(jù)還是都存儲(chǔ)在同一臺(tái)數(shù)據(jù)庫下,對(duì)應(yīng)用層而言是一個(gè)完整的數(shù)據(jù)表,在存儲(chǔ)引擎來看,就是把一張表里的數(shù)據(jù)分散到多個(gè)分區(qū)表(小表)存儲(chǔ)。查找數(shù)據(jù)時(shí)根據(jù)每個(gè)分區(qū)的句柄對(duì)象,調(diào)用存儲(chǔ)引擎接口去讀取磁盤下的數(shù)據(jù)。

句柄對(duì)象嘛,大家可理解為文件系統(tǒng)的操作對(duì)象,獲取數(shù)據(jù)時(shí)直接調(diào)用接口。

這能解決什么問題?


如果一張表數(shù)據(jù) 達(dá)到10億行,10TB多數(shù)據(jù)時(shí),再用索引查找就不能解決問題,因?yàn)槟銉?nèi)存不能存下這么多數(shù)據(jù)。每次查詢即使有索引也會(huì)有大量的隨機(jī)I/O,或者直接走全表掃描去了。本身索引維護(hù)也是需要資源開銷的。

為什么會(huì)有會(huì)有隨機(jī)I/O呢?索引不都是順序查找嗎?

因?yàn)槟愕腂+Tree有高度比較矮,雖可多存儲(chǔ)數(shù)據(jù),但還是不能容納下億級(jí)的數(shù)據(jù),如果不在你第一次的索引樹下,那又得重新查找其它索引樹,這樣是不是就隨機(jī)查找啦!至少都是成千上萬的。

所以就從數(shù)據(jù)的拆分來做到治理,和水平劃分有點(diǎn)相似。 o( ̄ ̄)d


那這個(gè)東西,我要如何使用?

在建表語句后加入 PARTITION BY 來定義分區(qū)類型,常用的是 RANGE 分區(qū)。

CREATE TABLE sales (

order_date DATETIME NOT NULL,

Other columns omitted

) ENGINE=InnoDB PARTITION BY RANGE(YEAR(order date)) (

PARTITION p_2020 VALUES LESS THAN (2020),

PARTITION p_2021 VALUES LESS THAN (2021),

PARTITION p_2022 VALUES LESS THAN (2022),

PARTITION p catchall VALUES LESS THAN MAXVALUE );


上面在建表的時(shí)候設(shè)計(jì),但一般使用該方案,都是在表里面已經(jīng)存儲(chǔ)了很多數(shù)據(jù)考慮的,針對(duì)后者采用

Alter Table 修改數(shù)據(jù)表為分區(qū)表就可以。

ALTER TABLE tbl_data PARTITION BY RANGE (Month(fld_date))

(

PARTITION p_Apr VALUES LESS THAN (TO_DAYS('2020-05-01')),

PARTITION p_May VALUES LESS THAN (TO_DAYS('2020-06-01')),

PARTITION p_Dec VALUES LESS THAN MAXVALUE );

如下是其它分區(qū)類型:

RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。


LIST分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來進(jìn)行選擇。

如: PARTITION p_2012 VALUES IN (4,12,13,14,18)


HASH分區(qū):基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。

如: PARTITION BY LINEAR HASH(YEAR(order_date))


KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且為MySQL服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。

如:PARTITION BY LINEAR KEY (col1)


如有幫助,歡迎關(guān)注@三頭六臂哪咤

公眾搜索:蓮花童子哪吒

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容