周末美好的閑暇時(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)注@三頭六臂哪咤
公眾搜索:蓮花童子哪吒