1. 程式人生 > >MySQL面試題(六)資料庫的分庫分表原理詳解

MySQL面試題(六)資料庫的分庫分表原理詳解


對使用者而言,分割槽表是一個獨立的邏輯表,但是底層MySQL將其分成了多個物理子表,這對使用者來說是透明的,每一個分割槽表都會使用一個獨立的表文件。


如圖所示:MySQL將表分成多個物理字表,客戶端並無感知,仍然認為操作的是一個表。

建立表時使用partition by子句定義每個分割槽存放的資料,執行查詢時,優化器會根據分割槽定義過濾那些沒有需要的資料的分割槽,這樣只需要查詢資料所在分割槽即可。



這樣子表相對於未分割槽的表來說佔用空間小,資料量更小,因此操作速度更快。

分割槽的主要目的是將資料按照一個較粗的粒度分在不同的表中,這樣可以將相關的資料存放在一起,而且如果想一次性的刪除整個分割槽的資料也和方便。


適用場景

1、表非常大,無法全部存在記憶體,或者只在表的最後有熱點資料,其他都是歷史資料。

2、分割槽表的資料更易維護,可以對獨立的分割槽進行獨立的操作。

3、分割槽表的資料可以分佈在不同的機器上,從而高效適用資源。

4、可以使用分割槽表來避免某些特殊的瓶頸

5、可以備份和恢復獨立的分割槽

限制

1、一個表最多隻能有1024個分割槽

2、5.1版本中,分割槽表表達式必須是整數,5.5可以使用列分割槽

3、分割槽表字段如果有主鍵和唯一索引列,那麼主鍵列和唯一索引列都必須包含進來

4、分割槽表中無法使用外來鍵約束

5、需要對現有表的結構進行修改

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

7、分割槽函式中可以使用的函式和表示式會有一些限制


8、某些儲存引擎不支援分割槽

9、對於MyISAM的分割槽表,不能使用load index into cache

10、對於MyISAM表,使用分割槽表時需要開啟更多的檔案描述符

分庫分表的工作原理

通過一些HASH演算法或者工具實現將一張資料表垂直或者水平進行物理切分

適用場景

1、單表記錄條數達到百萬或千萬級別時

2、解決表鎖的問題

分表方式

水平分表:表很大,分割後可以降低在查詢時需要讀的資料和索引的頁數,同時也降低了索引的層數,提高查詢次數