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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

数据库

012-- mysql的分区和分表

發(fā)布時(shí)間:2023/11/29 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 012-- mysql的分区和分表 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分區(qū)

分區(qū)就是把一個(gè)數(shù)據(jù)表的文件和索引分散存儲(chǔ)在不同的物理文件中。

mysql支持的分區(qū)類(lèi)型包括Range、List、Hash、Key,其中Range比較常用:

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

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

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

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

案例:

建立一個(gè)user 表 以id進(jìn)行分區(qū) id 小于10的在user_1分區(qū)id小于20的在user_2分區(qū)

create table user(id int not null auto_increment,username varchar(10),primary key(id) )engine = innodb charset=utf8 partition by range (id)(partition user_1 values less than (10),partition user_2 values less than (20) );

建立后添加分區(qū):

maxvalue 表示最大值 ? 這樣大于等于20的id 都出存儲(chǔ)在user_3分區(qū)

alter table user add partition(partition user_3 values less than maxvalue );

刪除分區(qū):

alter table user drop partition user_3;

?

如果表使用的存儲(chǔ)引擎是MyISAM類(lèi)型,就是:

user#P#user_1.MYD,user#P#user_1.MYI和user#P#user_2.MYD,user#P#user_2.MYI

由此可見(jiàn),mysql通過(guò)分區(qū)把數(shù)據(jù)保存到不同的文件里,同時(shí)索引也是分區(qū)的。相對(duì)于未分區(qū)的表來(lái)說(shuō),分區(qū)后單獨(dú)的數(shù)據(jù)庫(kù)文件索引文件的大小都明顯降低,效率則明顯的提示了。可以插入一條數(shù)據(jù)然后分析查詢(xún)語(yǔ)句驗(yàn)證一下:

insert into user values(null,'測(cè)試');explain partitions select * from user where id =1;

可以看見(jiàn)僅僅在user_1分區(qū)執(zhí)行了這條查詢(xún)。

具體分區(qū)的效率是多少還需要看數(shù)據(jù)量。在分區(qū)時(shí)可以通過(guò) DATA DIRECTORY 和?  INDEX DIRECTORY 選項(xiàng)吧不同的分區(qū)放到不同的磁盤(pán)上進(jìn)一步提高系統(tǒng)的I/O吞吐量。

分區(qū)類(lèi)型的選擇,通常使用Range類(lèi)型,不過(guò)有些情況,比如主從結(jié)構(gòu)中,主服務(wù)器很少使用‘select’查詢(xún),在主服務(wù)器上使用 Range類(lèi)型分區(qū)通常沒(méi)有太大的意義,此時(shí)使用Hash類(lèi)型分區(qū)更好例如:

partition by hash(id) partitions 10;

當(dāng)插入數(shù)據(jù)時(shí),根據(jù)id吧數(shù)據(jù)平均散到各個(gè)分區(qū)上,由于文件小,效率高,更新操作變得更快。

在分區(qū)時(shí)使用的字段,通常情況下按時(shí)間字段分區(qū),具體情況以需求而定。劃分應(yīng)用的方式有很多種,比如按時(shí)間或用戶(hù),哪種用的多,就選擇哪種分區(qū)。如果使用主從結(jié)構(gòu)可能就更加靈活,有的從服務(wù)器使用時(shí)間,有的使用用戶(hù)。不過(guò)如此一來(lái)當(dāng)執(zhí)行查詢(xún)時(shí),程序應(yīng)該負(fù)責(zé)選擇真確的服務(wù)器查詢(xún),寫(xiě)個(gè)mysql proxy腳本應(yīng)該可以透明的實(shí)現(xiàn)。

分區(qū)的限制:

1.主鍵或者唯一索引必須包含分區(qū)字段,如primary key (id,username),不過(guò)innoDB的大組建性能不好。

2.很多時(shí)候,使用分區(qū)就不要在使用主鍵了,否則可能影響性能。

3.只能通過(guò)int類(lèi)型的字段或者返回int類(lèi)型的表達(dá)式來(lái)分區(qū),通常使用year或者to_days等函數(shù)(mysql 5.6 對(duì)限制開(kāi)始放開(kāi)了)。

4.每個(gè)表最多1024個(gè)分區(qū),而且多分區(qū)會(huì)大量消耗內(nèi)存。

5.分區(qū)的表不支持外鍵,相關(guān)的邏輯約束需要使用程序來(lái)實(shí)現(xiàn)。

6.分區(qū)后,可能會(huì)造成索引失效,需要驗(yàn)證分區(qū)可行性。

分區(qū)模式詳解:

*?Range(范圍)?– 這種模式允許DBA將數(shù)據(jù)劃分不同范圍。例如DBA可以將一個(gè)表通過(guò)年份劃分成三個(gè)分區(qū),80年代(1980's)的數(shù)據(jù),90年代(1990's)的數(shù)據(jù)以及任何在2000年(包括2000年)后的數(shù)據(jù)。

CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, usersname VARCHAR(30) NOT NULL DEFAULT '', email VARCHAR(30) NOT NULL DEFAULT '' ) PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (3000000), PARTITION p1 VALUES LESS THAN (6000000), PARTITION p2 VALUES LESS THAN (9000000), PARTITION p3 VALUES LESS THAN MAXVALUE );

在這里,將用戶(hù)表分成4個(gè)分區(qū),以每300萬(wàn)條記錄為界限,每個(gè)分區(qū)都有自己獨(dú)立的數(shù)據(jù)、索引文件的存放目錄。

還可以將這些分區(qū)所在的物理磁盤(pán)分開(kāi)完全獨(dú)立,可以提高磁盤(pán)IO吞吐量。

CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, usersname VARCHAR(30) NOT NULL DEFAULT '', email VARCHAR(30) NOT NULL DEFAULT '' ) PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (3000000) DATA DIRECTORY = '/data0/data' INDEX DIRECTORY = '/data0/index', PARTITION p1 VALUES LESS THAN (6000000) DATA DIRECTORY = '/data1/data' INDEX DIRECTORY = '/data1/index', PARTITION p2 VALUES LESS THAN (9000000) DATA DIRECTORY = '/data2/data' INDEX DIRECTORY = '/data2/index', PARTITION p3 VALUES LESS THAN MAXVALUE DATA DIRECTORY = '/data3/data' INDEX DIRECTORY = '/data3/index' );

?

*?List(預(yù)定義列表)?– 這種模式允許系統(tǒng)通過(guò)DBA定義的列表的值所對(duì)應(yīng)的行數(shù)據(jù)進(jìn)行分割。例如:DBA根據(jù)用戶(hù)的類(lèi)型進(jìn)行分區(qū)。?

CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT '' ,user_type int not null ) PARTITION BY LIST (user_type ) ( PARTITION p0 VALUES IN (0,4,8,12) , PARTITION p1 VALUES IN (1,5,9,13) , PARTITION p2 VALUES IN (2,6,10,14), PARTITION p3 VALUES IN (3,7,11,15) );

分成4個(gè)區(qū),同樣可以將分區(qū)設(shè)置的獨(dú)立的磁盤(pán)中。



*?Key(鍵值)?– 上面Hash模式的一種延伸,這里的Hash Key是MySQL系統(tǒng)產(chǎn)生的。?

CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT '', email VARCHAR(30) NOT NULL DEFAULT '' ) PARTITION BY KEY (id) PARTITIONS 4 ( PARTITION p0, PARTITION p1, PARTITION p2, PARTITION p3 );

?

*?Hash(哈希)?– 這中模式允許DBA通過(guò)對(duì)表的一個(gè)或多個(gè)列的Hash Key進(jìn)行計(jì)算,最后通過(guò)這個(gè)Hash碼不同數(shù)值對(duì)應(yīng)的數(shù)據(jù)區(qū)域進(jìn)行分區(qū),。例如DBA可以建立一個(gè)對(duì)表主鍵進(jìn)行分區(qū)的表。?

CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL DEFAULT '', email VARCHAR(30) NOT NULL DEFAULT '' ) PARTITION BY HASH (id) PARTITIONS 4 ( PARTITION p0 , PARTITION p1, PARTITION p2,PARTITION p3 );

分成4個(gè)區(qū),同樣可以將分區(qū)設(shè)置的獨(dú)立的磁盤(pán)中。


= 分區(qū)管理 =


刪除分區(qū)

ALERT TABLE users DROP PARTITION p0;

重建分區(qū)

? RANGE 分區(qū)重建

ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES LESS THAN (6000000));

將原來(lái)的 p0,p1 分區(qū)合并起來(lái),放到新的 p0 分區(qū)中。

LIST 分區(qū)重建

ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES IN(0,1,4,5,8,9,12,13));

將原來(lái)的 p0,p1 分區(qū)合并起來(lái),放到新的 p0 分區(qū)中。

HASH/KEY 分區(qū)重建

ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2;

用 REORGANIZE 方式重建分區(qū)的數(shù)量變成2,在這里數(shù)量只能減少不能增加。想要增加可以用 ADD PARTITION 方法。

新增分區(qū)

新增 RANGE 分區(qū)??

alter table user add partition(partition user_3 values less than maxvalue);

?

新增 LIST 分區(qū)?

ALTER TABLE category ADD PARTITION (PARTITION p4 VALUES IN (16,17,18,19));

新增 HASH/KEY 分區(qū)

ALTER TABLE users ADD PARTITION PARTITIONS 8;

將分區(qū)總數(shù)擴(kuò)展到8個(gè)。

給已有的表加上分區(qū)

alter table results partition by RANGE (month(ttime)) (PARTITION p0 VALUES LESS THAN (1), PARTITION p1 VALUES LESS THAN (2) , PARTITION p2 VALUES LESS THAN (3) , PARTITION p3 VALUES LESS THAN (4) , PARTITION p4 VALUES LESS THAN (5) , PARTITION p5 VALUES LESS THAN (6) , PARTITION p6 VALUES LESS THAN (7) , PARTITION p7 VALUES LESS THAN (8) , PARTITION p8 VALUES LESS THAN (9) , PARTITION p9 VALUES LESS THAN (10) , PARTITION p10 VALUES LESS THAN (11), PARTITION p11 VALUES LESS THAN (12), PARTITION P12 VALUES LESS THAN (13) );

分表

分表和分區(qū)類(lèi)似,區(qū)別是,分區(qū)是把一個(gè)邏輯表文件分成幾個(gè)物理文件后進(jìn)行存儲(chǔ),而分表則是把原先的一個(gè)表分成幾個(gè)表。進(jìn)行分表查詢(xún)時(shí)可以通過(guò)union或者視圖。

分表又分垂直分割和水平分割,其中水平分分割最為常用。水平分割通常是指切分到另外一個(gè)數(shù)據(jù)庫(kù)或表中。例如對(duì)于一個(gè)會(huì)員表,按對(duì)3的模進(jìn)行分割:

table = id%3

如果id%3 = 0 則將用戶(hù)數(shù)據(jù)放入到user_0表中,如id%3=1就放入user_1表中,依次類(lèi)推。

在這里有個(gè)問(wèn)題,這個(gè)uid應(yīng)該是所有會(huì)員按序增長(zhǎng)的,可他是怎么得到的呢?使用auto_increment是不行的,這樣就用到序列了。

對(duì)于一些流量統(tǒng)計(jì)系統(tǒng),其數(shù)據(jù)量比較大,并且對(duì)過(guò)往數(shù)據(jù)的關(guān)注度不高,這時(shí)按年、月、日進(jìn)行分表,將每日統(tǒng)計(jì)信息放到一個(gè)以日期命名的表中;或者按照增量進(jìn)行分表,如每個(gè)表100萬(wàn)數(shù)據(jù),超過(guò)100萬(wàn)就放入第二個(gè)表。還可以按Hash進(jìn)行分表,但是按日期和取模余數(shù)分表最為常見(jiàn),也容易擴(kuò)展。

分表后可能會(huì)遇到新的問(wèn)題,那就是查詢(xún),分頁(yè)和統(tǒng)計(jì)。通用的方法是在程序中進(jìn)行處理,輔助視圖。

使用分表案例:

案例1:

對(duì)會(huì)員數(shù)據(jù)對(duì)5取模,放在5個(gè)表中,如何查詢(xún)會(huì)員數(shù)據(jù):

1.已知id查詢(xún)會(huì)員數(shù)據(jù),代碼如下:

<?php //查詢(xún)單個(gè)會(huì)員數(shù)據(jù) $customer_table = 'customer'.$id%5; $sql = 'select * from '.$customer_table.' where customer_id = '.$id; //查詢(xún)?nèi)繒?huì)員數(shù)據(jù) $sql = ''; $tbale = ['customer0','customer1','customer2','customer3','customer4']; foreach($table as $v){ $sql .='select * from '.$v.' union'; } $sql = substr($sql,0,-5);?>

這樣就可以查詢(xún)某一個(gè)會(huì)員的數(shù)據(jù)或者全部會(huì)員的數(shù)據(jù)了。同理,分頁(yè)的話(huà)在這個(gè)大集合中使用limit 就可以了。但是這樣做又會(huì)有一個(gè)疑問(wèn),把所有的表連起來(lái)查詢(xún)和部分表沒(méi)有什么區(qū)別,其實(shí)在實(shí)際的應(yīng)用中,不可能查看所有的會(huì)員資料,一次查看20個(gè)然后分頁(yè)。完全沒(méi)有必要做union,僅查詢(xún)一個(gè)表就可以了,唯一需要考慮的是在分頁(yè)零界點(diǎn)時(shí)的銜接。其實(shí),這個(gè)銜接是否那么重要?即使偶爾出現(xiàn)幾條數(shù)據(jù)的差異,也不會(huì)對(duì)業(yè)務(wù)有任何的影響。

2.和其它表進(jìn)行關(guān)聯(lián)和1類(lèi)似。

3.根據(jù)會(huì)員姓名搜索用戶(hù)信息。在這種需求下,需要搜索所有的表,并對(duì)結(jié)果進(jìn)行匯總。雖然這樣做產(chǎn)生了多次的查詢(xún),但并不代表效率低。好的sql語(yǔ)句執(zhí)行10次也比差的sql語(yǔ)句執(zhí)行一次快。

案例2:

在一個(gè)流量監(jiān)控系統(tǒng)中,由于網(wǎng)絡(luò)流量巨大,統(tǒng)計(jì)數(shù)據(jù)很龐大,需要按天分表。先要得到任意日,周,月的數(shù)據(jù)。

1.需要任意一天的數(shù)據(jù)。直接查詢(xún)當(dāng)天的數(shù)據(jù)表即可。

2.需要幾天的數(shù)據(jù)。分愛(ài)查詢(xún)這幾天的數(shù)據(jù),然后進(jìn)行匯總。

3.需要查詢(xún)一周的數(shù)據(jù)。對(duì)一周的數(shù)據(jù)定期匯總到一個(gè)week表,從這個(gè)表里面查詢(xún)。這個(gè)匯總過(guò)程可以由一個(gè)外部程序完成,也可以由定期的腳本完成。

4.查詢(xún)一個(gè)月的數(shù)據(jù)。匯總本月所有的數(shù)據(jù)到month表,在此表查詢(xún)。

5.查詢(xún)5個(gè)月內(nèi)的詳細(xì)數(shù)據(jù)。不支持。僅支持最多3個(gè)月的詳細(xì)數(shù)據(jù)。數(shù)據(jù)沒(méi)3個(gè)月已歸檔一次。在大數(shù)據(jù)的處理中,必須做出一些犧牲。對(duì)于超出3個(gè)月的數(shù)據(jù),僅提供統(tǒng)計(jì)數(shù)據(jù),詳細(xì)數(shù)據(jù)需要查看歸檔。90天或者180天,給數(shù)據(jù)保存設(shè)個(gè)界限,也是大部分這類(lèi)系統(tǒng)的常規(guī)做法,超出90天的數(shù)據(jù)就不再提供數(shù)據(jù)詳單了。比如,移動(dòng)的通話(huà)記錄最多保存半年,即180天,超過(guò)這個(gè)范圍的數(shù)據(jù)不在提供查詢(xún)。如果你實(shí)在需要,可能就要聯(lián)系移動(dòng)的工程師了。

分表前應(yīng)該盡量按照實(shí)際業(yè)務(wù)來(lái)分表,參考依據(jù)就是哪些字段在查詢(xún)中起到作用,那就這些字段來(lái)分表,并且需要在分表前就估算好規(guī)模,也就是先確定好規(guī)則在分表。

對(duì)于分表后的操作,依然是聯(lián)合查詢(xún),視圖等基本操作,或者使用merge引擎合并數(shù)據(jù)并在此表中查詢(xún)。復(fù)雜一些操作需要借助存儲(chǔ)過(guò)程來(lái)完成,借助外部工具實(shí)現(xiàn)對(duì)分表的管理。

對(duì)于比較龐大的數(shù)據(jù),不論是否進(jìn)行分表,都必須考慮功能和效率的平衡性,并在功能上做出讓步。我們不能事事遷就用戶(hù),而應(yīng)該對(duì)某些影響效率的功能做出限制。例如移動(dòng)公司的180天限制、論壇禁止對(duì)老帖進(jìn)行回復(fù)等。

轉(zhuǎn)載于:https://www.cnblogs.com/yxllovetm/p/10123731.html

總結(jié)

以上是生活随笔為你收集整理的012-- mysql的分区和分表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 三级欧美韩日大片在线看 | 国产美女视频网站 | 国产美女精品一区二区三区 | 欧美1级片 | 欧美日韩国产一区二区 | 日本私人影院 | jizz中国少妇 | 国产美女免费视频 | 久久av免费观看 | 777久久久精品一区二区三区 | 日韩高清成人 | 俺也去婷婷 | 在线免费av网 | 阿v天堂2014| 性生交大片免费看狂欲 | 国产情侣露脸自拍 | av日韩免费| 国产伦精品一区二区三区视频免费 | 综合色在线 | 国产古装艳史毛片hd | 丰满少妇被猛烈进入无码 | 日韩一级生活片 | 中文在线观看av | www,色| 污黄网站在线观看 | 欧美日韩色片 | 久久久噜噜噜久久中文字幕色伊伊 | 永久免费精品 | 成人免费观看视频 | 欧美在线播放 | 极品美女一区二区三区 | 亚洲九色 | 久久92 | 久久久久亚洲AV成人无码国产 | 丰满少妇xbxb毛片日本 | 人人干人人爽 | 亚洲国产成人va在线观看天堂 | 麻豆系列在线观看 | 久久22 | 色七七桃花综合影院 | 五月天婷婷综合 | 中文字幕日韩精品亚洲一区小树林 | 久久艹中文字幕 | 国产乱了高清露脸对白 | 蜜桃视频在线观看一区 | 国产精品96| 91av福利 | 182tv福利视频 | 欧美黑人猛交 | 国产亚洲精品av | 欧美激情一区二区三级高清视频 | 日韩精品在线免费 | 久久久久久久久久免费视频 | 奇米精品一区二区三区在线观看 | 国产成人一区二区三区 | 人妻视频一区二区 | a级片免费在线观看 | 男人天堂成人网 | 天天综合天天做天天综合 | 在线观看国产区 | 日韩一区二区在线播放 | 亚洲九九热 | 视频一二三区 | 欧美深夜福利 | 日韩精品一区二区三区高清免费 | 久草婷婷| 国产青青| 成熟的女同志hd | 欧美亚洲影院 | 久久av在线播放 | 网红av在线| 丝袜美腿亚洲综合 | 秋霞自拍| 视频一区二区在线 | 99精品在线免费视频 | 亚洲中文字幕无码一区二区三区 | 天堂草在线观看 | 日韩在线观看中文字幕 | 国产一区二区激情视频 | 激情五月亚洲 | 亚洲国产精品女人久久久 | 国产色视频一区二区三区qq号 | 性日韩 | 精品成人在线视频 | 成年人拍拍视频 | 曰本毛片 | 天天舔天天 | 国产九九精品视频 | 亚洲精品久久久久久久久久久 | 亚洲理论片在线观看 | 青青草久久久 | 亚洲精品在线视频 | 亚洲国产精品99久久 | 欧美极品一区二区三区 | 小嫩嫩12欧美 | 国产中文字幕乱人伦在线观看 | 亚洲丝袜在线视频 | 狠狠干狠狠艹 | 中文字幕第5页 |