MySQL分区分表 原理详解
MySQL分區分表
為什么要分區和分表
我們的數據庫數據越來越大,隨之而來的是單個表中數據太多,以至于查詢速度過慢,而且由于表的鎖機制導致應用操作也受到嚴重影響,出現數據庫性能瓶頸。
MySQL中有一種機制是表鎖定和行鎖定,是為了保證數據的完整性。表鎖定表示你們都不能對這張表進行操作,必須等我對表操作完才行。行鎖定也一樣,別的sql必須等我對這條數據操作完了,才能對這條數據進行操縱。但出現這種情況時,我們可以考慮分表或者分區。
1、分表
什么是分表
分表是將一個大表按照一定的規則分解成多張具有獨立存儲空間的實體表,每個表都對應三個文件,MYD數據文件,MYI索引文件,frm表結構文件。這些表可以分布在同一塊磁盤上,也可以在不同的機器上。app讀寫的時候根據事先定義好的規則得到對應的表名,然后去操作他。
用單個數據庫表進行拆分,拆分成多個數據表,然后用戶訪問的時候,根據一定的算法(如用hash算法的方式,也可以用求余(取模)的方式),讓用戶訪問不同的表,這樣數據分散到多個數據表中,減少了單個表的訪問壓力,提升了數據庫的訪問性能。分表的目的就在于此,減少數據庫的負擔,縮短查詢時間。
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函數。
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分区分表 原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 豪华电动汽车品牌“歌昂” 即将登场,背后
- 下一篇: mongodb查询数据库中某个字段中的值