1. 程式人生 > 其它 >淺談MySQL分割槽表優點和限制

淺談MySQL分割槽表優點和限制

分割槽是將一個表的資料按照某種方式,邏輯上仍是一個表,也就是所謂的分割槽表。分割槽引入了分割槽鍵的概念,分割槽鍵用於根據某個區間值(或者範圍值)、特定值列表或者hash函式值執行資料的聚集,讓資料根據規則分佈在不同的分割槽中,讓一個大物件變成一些小物件,從而實現對資料的分化管理。作為MySQL資料庫中的一個重要機制,MySQL分割槽表優點和限制也是一目瞭然的,然而又能夠同時實現共存。

一、我們先來看MySQL分割槽表優點:

1、與單個磁碟或檔案系統分割槽相比,可以儲存更多的資料。

2、對於那些已經失去儲存意義的資料,通常可以通過刪除與那些資料有關的分割槽,很容易地刪除那些資料。相反地,在某些情況下,新增新資料的過程又可以通過為那些新資料專門增加一個新的分割槽,來很方便地實現。

3、一些查詢可以得到極大的優化,這主要是藉助於滿足一個給定WHERE語句的資料可以只儲存在一個或多個分割槽內,這樣在查詢時就不用查詢其他剩餘的分割槽。因為分割槽可以在建立了分割槽表後進行修改,所以在第一次配置分割槽方案時還不曾這麼做時,可以重新組織資料,來提高那些常用查詢的效率。

4、涉及到例如SUM()和COUNT()這樣聚合函式的查詢,可以很容易地進行並行處理。這種查詢的一個簡單例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通過“並行”,這意味著該查詢可以在每個分割槽上同時進行,最終結果只需通過總計所有分割槽得到的結果。

5、通過跨多個磁碟來分散資料查詢,來獲得更大的查詢吞吐量。

二、 說完了MySQL分割槽表優點,我們再來說說MySQL分割槽表限制。

1、因為需要根據分割槽列來確定資料所在分割槽,所以分割槽列必須作為查詢條件, 如果不使用分割槽列的查詢條件,那麼就無法進行分割槽過濾,Mysql最終會掃描所有分割槽。

2、所有分割槽都必須使用相同的儲存引擎。

3、某些儲存引擎不支援分割槽(MERGE、CSV、FEDERATED)。

4、一張表最多隻能有1024個分割槽。

5、分割槽表中無法對非分割槽列建立唯一索引(Unique Index)。

6、分割槽表中無法使用外來鍵。

7 、開啟並鎖住所有底層表的成本可能很高。

當查詢訪問分割槽表的時候,MySQL需要開啟並鎖住所有的底層表,這是分割槽表的另一個開銷。這個操作在分割槽過濾之前發生,所以無法通過分割槽過濾降低此開銷,並且該開銷也和分割槽型別無關,會影響所有的查詢。

8、維護分割槽的成本可能很高

某些分割槽維護操作的速度會非常快,例如新增或者刪除分割槽。而有些操作,例如充足分割槽或類似alter語句的操作;這類操作需要賦值資料。重組分割槽的原理與alter類似,先建立一個臨時的分割槽,然後將資料賦值到其中,然後在刪除原分割槽。

9、分割槽的欄位,必須是表上所有的唯一索引(或者主鍵索引)包含的欄位的子集。一個表上有一個或者多個唯一索引的情況下,分割槽的欄位必須被包含在所有的主鍵或者唯一索引欄位中。

10、分割槽鍵非NULL約束

如果分割槽鍵所在列沒有notnull約束,如果是range分割槽表,那麼null行將被儲存在範圍最小的分割槽。如果是list分割槽表,那麼null行將被儲存到list為0的分割槽。

在按HASH和KEY分割槽的情況下,任何產生NULL值的表示式mysql都視同它的返回值為0。為了避免這種情況的產生,建議分割槽鍵設定成NOT NULL。

11、分割槽鍵必須是INT型別,或者通過表示式返回INT型別,可以為NULL。唯一的例外是當分割槽型別為KEY分割槽的時候,可以使用其他型別的列作為分割槽鍵( BLOB or TEXT 列除外)。

12、只有RANG和LIST分割槽能進行子分割槽,HASH和KEY分割槽不能進行子分割槽。

以上就是為大家羅列出的MySQL分割槽表的優點和限制,我們不難看出儘管MySQL分割槽表有著十分出眾的優點,但其本身存在的限制也是很多的,這就需要我們通過不斷的改善和發展技術來實現MySQL分割槽表的發展。