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

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

生活随笔

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

数据库

MySQL分区分表 原理详解

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

MySQL分區(qū)分表
為什么要分區(qū)和分表

我們的數(shù)據(jù)庫(kù)數(shù)據(jù)越來(lái)越大,隨之而來(lái)的是單個(gè)表中數(shù)據(jù)太多,以至于查詢速度過(guò)慢,而且由于表的鎖機(jī)制導(dǎo)致應(yīng)用操作也受到嚴(yán)重影響,出現(xiàn)數(shù)據(jù)庫(kù)性能瓶頸。

MySQL中有一種機(jī)制是表鎖定和行鎖定,是為了保證數(shù)據(jù)的完整性。表鎖定表示你們都不能對(duì)這張表進(jìn)行操作,必須等我對(duì)表操作完才行。行鎖定也一樣,別的sql必須等我對(duì)這條數(shù)據(jù)操作完了,才能對(duì)這條數(shù)據(jù)進(jìn)行操縱。但出現(xiàn)這種情況時(shí),我們可以考慮分表或者分區(qū)。

1、分表
什么是分表
分表是將一個(gè)大表按照一定的規(guī)則分解成多張具有獨(dú)立存儲(chǔ)空間的實(shí)體表,每個(gè)表都對(duì)應(yīng)三個(gè)文件,MYD數(shù)據(jù)文件,MYI索引文件,frm表結(jié)構(gòu)文件。這些表可以分布在同一塊磁盤上,也可以在不同的機(jī)器上。app讀寫的時(shí)候根據(jù)事先定義好的規(guī)則得到對(duì)應(yīng)的表名,然后去操作他。
用單個(gè)數(shù)據(jù)庫(kù)表進(jìn)行拆分,拆分成多個(gè)數(shù)據(jù)表,然后用戶訪問(wèn)的時(shí)候,根據(jù)一定的算法(如用hash算法的方式,也可以用求余(取模)的方式),讓用戶訪問(wèn)不同的表,這樣數(shù)據(jù)分散到多個(gè)數(shù)據(jù)表中,減少了單個(gè)表的訪問(wèn)壓力,提升了數(shù)據(jù)庫(kù)的訪問(wèn)性能。分表的目的就在于此,減少數(shù)據(jù)庫(kù)的負(fù)擔(dān),縮短查詢時(shí)間。

MySQL分表分為垂直切分和水平切分垂直切分是指數(shù)據(jù)表列的切分,把一張列比較多的表拆分為多張表。通常我們按照以下原則進(jìn)行垂直切分:把不常用的字段單獨(dú)放到一張表。把text,blob(binary large object,二進(jìn)制大對(duì)象)等大字段拆分出來(lái)放在附表中經(jīng)常組合查詢的列放在一張表中:垂直切分更多時(shí)候就應(yīng)該在數(shù)據(jù)表設(shè)計(jì)之初就執(zhí)行的步驟,然后查詢的時(shí)候用join關(guān)鍵起來(lái)即可。水平拆分是指數(shù)據(jù)表行的拆分,把一張表的數(shù)據(jù)拆成多張表來(lái)存放。水平拆分的原則通常情況下,我們使用hash,取模的方式來(lái)進(jìn)行表的拆分。比如一張擁有400W的用戶表users,為了提高其查詢效率,我們把其分為四張表 user1,user2,user3,user4通過(guò)ID取模的方法把數(shù)據(jù)分散到四張表內(nèi) id%4=[0,1,2,3]然后查詢,更新,刪除也是通過(guò)取模的方式來(lái)查詢部分業(yè)務(wù)邏輯也可以通過(guò)地區(qū),年份等字段來(lái)進(jìn)行歸檔拆分;進(jìn)行拆分后的表,這是我們就要約束用戶的查詢行為。比如我們是按年來(lái)進(jìn)行拆分的,這個(gè)時(shí)候在頁(yè)面設(shè)計(jì)上就約束用戶必須要先選擇年,然后才能進(jìn)行查詢。分表的幾種方式1、mysql集群他并不是分表,但是起到了和分表相同的作用。集群可分擔(dān)數(shù)據(jù)庫(kù)的操作次數(shù),將任務(wù)分擔(dān)到多臺(tái)數(shù)據(jù)庫(kù)上。集群可以讀寫分離,減少讀寫的壓力。從而提升數(shù)據(jù)庫(kù)的性能。2、預(yù)先估計(jì)會(huì)出現(xiàn)大數(shù)據(jù)量并且訪問(wèn)頻繁的表,將其分為若干個(gè)表根據(jù)一定的算法(如hash的方式,也可以使用求余(取模)的方式)讓用戶訪問(wèn)不同的表。3、利用merge存儲(chǔ)去引擎來(lái)實(shí)現(xiàn)分表merge分表,分為主表和子表,主表類似于一個(gè)殼子,邏輯上封裝了子表,實(shí)際上都是存儲(chǔ)在子表中的。我們可以通過(guò)主表插入和查詢數(shù)據(jù),如果清除分表規(guī)律也可以直接操作子表。

2、分區(qū)
什么是分區(qū)
分區(qū)和分表相似,都是按照規(guī)則分解表。不同在與分表將大表分解若干個(gè)獨(dú)立的實(shí)體表,而分區(qū)是將數(shù)據(jù)分段劃分在多個(gè)位置存放,分區(qū)后,表還是一張表,但數(shù)據(jù)散列到多個(gè)位置了。app讀寫的時(shí)候操作還是表名子,db自動(dòng)去組織分區(qū)的數(shù)據(jù)。

分區(qū)主要的兩種數(shù)據(jù);水平分區(qū):這種形式的分區(qū)是對(duì)表的行進(jìn)行分區(qū),所有在表中定義的列在每個(gè)數(shù)據(jù)集中都能找到,所以表的特性依然得以保持。垂直分區(qū):這種分區(qū)形式一般來(lái)說(shuō)是通過(guò)對(duì)表的垂直劃分來(lái)減少對(duì)目標(biāo)表的寬度,使某些特定的列,被劃分到特定的分區(qū),每個(gè)分區(qū)都包括了其中的列所對(duì)應(yīng)的行。

MySQL的分區(qū)類型
1、RANGE分區(qū)
基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給給分區(qū)。這些區(qū)間要連續(xù)且不能相互重疊,使用values less than操作符進(jìn)行定義。
2、LIST分區(qū)
類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。
LIST分區(qū)通過(guò)使用“PARTITION BY LIST"(expr)來(lái)實(shí)現(xiàn),其中expr 是某列值或一個(gè)基于某個(gè)列值、并返回一個(gè)整數(shù)值的表達(dá)式,然后通過(guò):VALUES IN (value_list)”的方式來(lái)定義某個(gè)分區(qū),其中“value——list“是一個(gè)通過(guò)逗號(hào)分隔的整數(shù)列表。
3、Hash分區(qū)
這種模式允許DBA通過(guò)對(duì)表的一個(gè)或多個(gè)列的Hash Key進(jìn)行計(jì)算,最后通過(guò)這個(gè)Hash碼不同的數(shù)值對(duì)應(yīng)的數(shù)據(jù)區(qū)域進(jìn)行分區(qū)。
hash分區(qū)的目的是將數(shù)據(jù)均勻分步到預(yù)先定義的各個(gè)分區(qū)中,保證各分區(qū)的數(shù)據(jù)的數(shù)據(jù)量大致一致。在RANGE和LIST分區(qū)中,必須明確指定一個(gè)給定的列值或列值集合應(yīng)該保存在哪一個(gè)分區(qū)中;而在RANGE和LIST分區(qū)中MySQL自動(dòng)完成這個(gè)動(dòng)作,用戶所要定一個(gè)列值或者表達(dá)式,以及指定被分區(qū)的表將要被分割成分區(qū)的數(shù)量。
4、Key分區(qū)
Key分區(qū)和Hash相似,不同在于hash分區(qū)是用戶自定義函數(shù)進(jìn)行分區(qū),Key分區(qū)使用mysql數(shù)據(jù)庫(kù)提供的分區(qū)進(jìn)行分區(qū),NDB clust使用MD5函數(shù)進(jìn)行分區(qū),對(duì)于其他存儲(chǔ)引擎mysql使用內(nèi)部的hash函數(shù)。

以上四種分區(qū)方式中,分區(qū)的條件必須是×××,如果不是×××,需要通過(guò)函數(shù)將其轉(zhuǎn)換為整行。5、columns 分區(qū)mysql5.5開(kāi)始支持COLUMNS分區(qū),可視為RANGE和LIST分區(qū)的進(jìn)化,COLUMNS分區(qū)可以直接使用×××數(shù)據(jù)進(jìn)行分區(qū)。COLUMNS分區(qū)支持一下數(shù)據(jù)類型。所有×××,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL則不支持。日期類型,如DATE和DATETIME。其余日期類型不支持。字符串類型,如CHAR,VARCHAR,BINARY,和VARBINSRY。BOLB和TEXT類型不支持。COLUMNS可以使用多個(gè)列進(jìn)行分區(qū)。

MySQL分表和分區(qū)有什么區(qū)別
1、實(shí)現(xiàn)方式上
1、mysql的分表是真正意義上的分表,一張表分成很多表以后,每一個(gè)小表都是完整的一張表,都對(duì)應(yīng)三個(gè)文件,一個(gè)是MYD數(shù)據(jù)文件,MYI索引文件,frm表結(jié)構(gòu)文件
2、分區(qū)不一樣,一張大表進(jìn)行分區(qū)后,他還是一張表,不會(huì)變成二張表,但是他存放數(shù)據(jù)的區(qū)塊變多了。
2、在數(shù)據(jù)上
1、分表后,數(shù)據(jù)都是存放在分表里,總表只是一個(gè)外殼,存放數(shù)據(jù)發(fā)生在一個(gè)一個(gè)的分表里。
2、分區(qū)呢,不存在分表的概念,分區(qū)只不過(guò)把存放數(shù)據(jù)的文件分成許多的小塊,分區(qū)后的表呢,還是一張表,數(shù)據(jù)處理還是有自己完成。
3、提高性能上
1、分表后,單表的并發(fā)能力提高了,磁盤IO性能提高了。
為什么并發(fā)提高了,因?yàn)椴樵円淮嗡ǖ臅r(shí)間變短了,如果出現(xiàn)高并發(fā)的花,總表可以根據(jù)不同的查詢,將并發(fā)壓力分到不同的小表里面。
2、mysql提出了分區(qū)的概念,主要是想突破磁盤的IO瓶頸,提高磁盤的讀寫能力,提高磁盤的讀寫能力來(lái)增加mysql的性能。
在這一點(diǎn)上,分區(qū)和分表的側(cè)重點(diǎn)不同,分表重點(diǎn)是存取數(shù)據(jù)時(shí),如何提高mysql并發(fā)能力上,而分區(qū)是突破磁盤的讀寫能力,從而達(dá)到提高mysql性能的目的。
4、實(shí)現(xiàn)難易程度上
1、分表的方法有很多,用merge來(lái)分表,是最簡(jiǎn)單的一種方式。這種方式跟分區(qū)的難以程度差不多,并且對(duì)程序代碼來(lái)說(shuō)可以做到透明。如果是用其他分表方式就比分區(qū)麻煩了。
2、分區(qū)實(shí)現(xiàn)是比較簡(jiǎn)單的,建立分區(qū)表,跟建平常的表沒(méi)有什么區(qū)別,并且對(duì)開(kāi)代碼端來(lái)說(shuō)是透明的。
mysql分表和分區(qū)有什么聯(lián)系
1、都是提高mysql的性能,在高并發(fā)的狀態(tài)下都有一個(gè)良好的表現(xiàn)
2、分表和分區(qū)不矛盾,可以相互配合的,對(duì)于那些大訪問(wèn)量,并且表數(shù)據(jù)比較多的表。我們可以采取分區(qū)的方式,訪問(wèn)量不大,但是表數(shù)據(jù)較多的表,我們可以采取分區(qū)的方式等。
3、分表技術(shù)是比較麻煩的,需要手動(dòng)去創(chuàng)建子表,app服務(wù)端讀寫的時(shí)候需要計(jì)算子表名。采用merge好一些,但也要?jiǎng)?chuàng)建子表和配置子表間的union關(guān)系。
4、表分區(qū)相當(dāng)于分表,操作方便,不需要?jiǎng)?chuàng)建子表。

轉(zhuǎn)載于:https://blog.51cto.com/13214087/2149994

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

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

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