MySQL面試題(六)資料庫的分庫分表原理詳解
阿新 • • 發佈:2018-12-24
對使用者而言,分割槽表是一個獨立的邏輯表,但是底層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、解決表鎖的問題
分表方式
水平分表:表很大,分割後可以降低在查詢時需要讀的資料和索引的頁數,同時也降低了索引的層數,提高查詢次數