1、為什么要分表和分區(qū)
日常開發(fā)中我們經(jīng)常會遇到大表的情況,所謂的大表是指存儲了百萬級乃至千萬級條記錄的表。這樣的表過于龐大,導致數(shù)據(jù)庫在查詢和插入的時候耗時太長,性能低下,如果涉及聯(lián)合查詢的情況,性能會更加糟糕。分表和表分區(qū)的目的就是減少數(shù)據(jù)庫的負擔,提高數(shù)據(jù)庫的效率,通常點來講就是提高表的增刪改查效率。
2、什么是分表和分區(qū)
2.1 分表
分表是將一個大表按照一定的規(guī)則分解成多張具有獨立存儲空間的實體表,我們可以稱為子表,每個表都對應三個文件,MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結(jié)構(gòu)文件。這些子表可以分布在同一塊磁盤上,也可以在不同的機器上。app讀寫的時候根據(jù)事先定義好的規(guī)則得到對應的子表名,然后去操作它。
2.2 分區(qū)
分區(qū)和分表相似,都是按照規(guī)則分解表。不同在于分表將大表分解為若干個獨立的實體表,而分區(qū)是將數(shù)據(jù)分段劃分在多個位置存放,可以是同一塊磁盤也可以在不同的機器。分區(qū)后,表面上還是一張表,但數(shù)據(jù)散列到多個位置了。app讀寫的時候操作的還是大表名字,db自動去組織分區(qū)的數(shù)據(jù)。
分區(qū)的主要目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減響應時間。
2.3 mysql分表和分區(qū)有什么聯(lián)系呢?
1)、都能提高mysql的性能,在高并發(fā)狀態(tài)下都有一個良好的表現(xiàn)。
2)、分表和分區(qū)不矛盾,可以相互配合的,對于那些大訪問量,并且表數(shù)據(jù)比較多的表,我們可以采取分表和分區(qū)結(jié)合的方式,訪問量不大,但是表數(shù)據(jù)很多的表,我們可以采取分區(qū)的方式等。
3)、分表技術是比較麻煩的,需要手動去創(chuàng)建子表,app服務端讀寫時候需要計算子表名。采用merge好一些,但也要創(chuàng)建子表和配置子表間的union關系。
4)、表分區(qū)相對于分表,操作方便,不需要創(chuàng)建子表。
3、分表的幾種方式
3.1 mysql集群
它并不是分表,但起到了和分表相同的作用。集群可分擔數(shù)據(jù)庫的操作次數(shù),將任務分擔到多臺數(shù)據(jù)庫上。集群可以讀寫分離,減少讀寫壓力。從而提升數(shù)據(jù)庫性能。
3.2 自定義規(guī)則分表
大表可以按照業(yè)務的規(guī)則來分解為多個子表。通常為以下幾種類型,也可自己定義規(guī)則。
Range(范圍)–這種模式允許將數(shù)據(jù)劃分不同范圍。例如可以將一個表通過年份劃分成若干個分區(qū)。
Hash(哈希)–這中模式允許通過對表的一個或多個列的Hash Key進行計算,最后通過這個Hash碼不同數(shù)值對應的數(shù)據(jù)區(qū)域進行分區(qū)。例如可以建立一個對表主鍵進行分區(qū)的表。
Key(鍵值)–上面Hash模式的一種延伸,這里的Hash Key是MySQL系統(tǒng)產(chǎn)生的。
List(預定義列表)–這種模式允許系統(tǒng)通過預定義的列表的值來對數(shù)據(jù)進行分割。
Composite(復合模式)–以上模式的組合使用
分表規(guī)則與分區(qū)規(guī)則一樣,在分區(qū)模塊詳細介紹。
下面以Range簡單介紹下如何分表(按照年份表)。
假設表結(jié)構(gòu)有4個字段:自增id,姓名,存款金額,存款日期
把存款日期作為規(guī)則分表,分別創(chuàng)建幾個表
2011年:account_2011
2012年:account_2012
……
2015年:account_2015
app在讀寫的時候根據(jù)日期來查找對應的表名,需要手動來判定。