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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL分区分表 原理详解

發布時間:2025/6/17 数据库 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL分区分表 原理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL分區分表
為什么要分區和分表

我們的數據庫數據越來越大,隨之而來的是單個表中數據太多,以至于查詢速度過慢,而且由于表的鎖機制導致應用操作也受到嚴重影響,出現數據庫性能瓶頸。

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

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

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

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

分區主要的兩種數據;水平分區:這種形式的分區是對表的行進行分區,所有在表中定義的列在每個數據集中都能找到,所以表的特性依然得以保持。垂直分區:這種分區形式一般來說是通過對表的垂直劃分來減少對目標表的寬度,使某些特定的列,被劃分到特定的分區,每個分區都包括了其中的列所對應的行。

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

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

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

轉載于:https://blog.51cto.com/13214087/2149994

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

總結

以上是生活随笔為你收集整理的MySQL分区分表 原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。