mysql数据的表分区一
當(dāng)mysql中醫(yī)個(gè)表的總記錄數(shù)超過(guò)了1000W,會(huì)出現(xiàn)性能大幅度下降的情況,單性能下降的比率由系統(tǒng)的架構(gòu)、應(yīng)用程序、數(shù)據(jù)庫(kù)索引、服務(wù)器硬件等多種因素而定。數(shù)據(jù)庫(kù)多達(dá)上億的數(shù)據(jù)量,分表之后的單個(gè)表 也已經(jīng)超過(guò)了千萬(wàn),那么單個(gè)表的更新等均影響著系統(tǒng)的運(yùn)行效率。甚至是以條簡(jiǎn)單的sql都有可能壓垮整個(gè)數(shù)據(jù)庫(kù),如整個(gè)表對(duì)某個(gè)字段的排序操作等。
我們針對(duì)海量數(shù)據(jù)的優(yōu)化主要有兩種方法:達(dá)標(biāo)拆小表的方式,sql語(yǔ)句的優(yōu)化
sql語(yǔ)句的優(yōu)化:可以通過(guò)增加索引等來(lái)調(diào)整,但是數(shù)據(jù)量的增大會(huì)導(dǎo)致索引的維護(hù)帶價(jià)增大。
大表拆小表,一般分有 垂直分割 和 水平分割 兩種,一般我們對(duì)大的數(shù)據(jù)表進(jìn)行分割的情況下使用的是水平分割,為了防止冗余,而且要求字段比較少,所以采用水平分割。
?
從mysql5.1以后的版本里面增加了一個(gè)技術(shù),是以插件的方式加入到mysql中。就是分區(qū)技術(shù)
分區(qū)技術(shù)可以解決,硬件上比較大的表帶來(lái)的影響,邏輯上表名不變。
目前分區(qū)技術(shù) 有4種分區(qū)類型:
RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)
LIST分區(qū):類似于RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇
HASH分區(qū):基于用戶定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入的表中的這些行的 列值進(jìn)行計(jì)算,這個(gè)函數(shù)可以包含mysql中有效的、生產(chǎn)非負(fù)整數(shù)值的任何表達(dá)式
KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且mysql服務(wù)器提供其自身的哈希函數(shù)。
例子:假定了一個(gè)如下的表,該表保存了有20家店的志愿記錄,這20加店的標(biāo)號(hào)從1-20.如果你想將其分成4個(gè)小分區(qū),那么可以采用RANGE分區(qū),創(chuàng)建的數(shù)據(jù)庫(kù)表如下:
mysql>create table employees(
->? id INT NOT NULL,??????? //這是一個(gè)ID,××× 不能為空
->? fname VARCHAR(30),???// 這是 第一個(gè)名字 varchar類型
->? lname VARCHAR(30),?
->? hired DATE NOT NULL DEFAULT '1970-01-01',? //這是入職時(shí)間 時(shí)間類型 不能為空
->? separated DATE NOT NULL DEFAULT '9999-12-12',? //這是離職時(shí)間 和入職一樣
->? job_code INT NOT NULL,??? //這是 員工的編號(hào) ×××,不能為空
->? store_id INT NOT NULL?? //這是店的編號(hào),×××,不能為空
->? )
->? PARTITION BY RANGE(store_id)(? //這里是用RANGE分區(qū)的店的編號(hào)進(jìn)行分區(qū)
->? PARTITION p0 VALUES LESS THAN(6),?? //6號(hào)店之前的分到 p0 分區(qū)里面
->? PARTITION p1 VALUES LESS THAN(11), //下面就不用解釋了 就是分到不同的區(qū)
->? PARTITION p2 VALUES LESS THAN(16),
->? PARTITION p3 VALUES LESS THAN(21)
->? );
上面的例子 是按照店編號(hào)來(lái)進(jìn)行分區(qū),還有我們的用戶 或者員工非常多,有上萬(wàn),那么我們也可以按照他們不同的入職時(shí)間來(lái)進(jìn)行分區(qū),也就是按照時(shí)間來(lái)分區(qū),例子如下:
mysql>create table employees(
->? id INT NOT NULL,??????? //這是一個(gè)ID,××× 不能為空
->? fname VARCHAR(30),???// 這是 第一個(gè)名字 varchar類型
->? lname VARCHAR(30),?
->? hired DATE NOT NULL DEFAULT '1970-01-01',? //這是入職時(shí)間 時(shí)間類型 不能為空
->? separated DATE NOT NULL DEFAULT '9999-12-12',? //這是離職時(shí)間 和入職一樣
->? job_code INT NOT NULL,??? //這是 員工的編號(hào) ×××,不能為空
->? store_id INT NOT NULL?? //這是店的編號(hào),×××,不能為空
->? )
->? PARTITION BY RANGE(YEAR(hired))(? //這里是用year函數(shù)來(lái)計(jì)算出入職的年???????????????????
->? PARTITION p0 VALUES LESS THAN(1991),?? //1991年之前的分到 p0 分區(qū)里面
->? PARTITION p1 VALUES LESS THAN(2001), //下面就不用解釋了 就是分到不同的區(qū)
->? PARTITION p2 VALUES LESS THAN(2011),
->? PARTITION p3 VALUES LESS THAN MAXVALUE //如以上無(wú)法匹配 剩余的存放一個(gè)表里
->? );
下面這張圖是剛剛分區(qū)所形成的表的文件:
來(lái)解釋一下:
分區(qū)后 總共生成了10個(gè)文件,這10個(gè)文件分別是:
employees.frm 是表的結(jié)構(gòu)
employees.par 是分區(qū)表
employees#P#p0.MYD? 是表的索引的文件
employees#P#p0.MYI?? 是表的數(shù)據(jù)的文件
一個(gè)大的表 拆分 成多個(gè)小的表 可以極大的降低 對(duì)操作系統(tǒng)的影響,減少資源浪費(fèi)
轉(zhuǎn)載于:https://blog.51cto.com/yanzhe/1188848
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql数据的表分区一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 线性表顺序表---逆置所有元素
- 下一篇: SCCM2012 R2集成WSUS服务器