分區表歷史數據庫
一、MySQL 5.1版本開始支持基於整數列的分區表, 二、MySQL 5.5版本開始支持RANGE和LIST分區,支持TRUNCATE分區,新增COLUMNS關鍵詞簡化分區定義。 三、MySQL 5.6版本開始支持分區交換,支持顯式分區查詢,支持最大8182個分區或子分區。 四、MySQL 5.7版本引入本地分區策略,並標記棄用通用分區策略。
分區策略緩存
按照管理打開分區的行爲能夠將分區策略分爲兩類: 一、通用分區策略(Generic Partitioning), 由MySQL Server層負責控制訪問分區。 二、本地分區策略(Native Partitioning),由存儲引擎層負責控制訪問分區。 在MySQL開始支持分區表時,將分區表訪問控制操做放在MySQL Server層實現,因爲在文件管理/表管理等方面實現較爲粗糙,存在嚴重性能問題。而不一樣存儲引擎層使用不一樣存儲機制/索引結構/訪問控制(鎖),能夠經過特殊設計來提高或優化特定的操做,將分區訪問控制策略放置在存儲引擎中實現更好。 通用分區策略問題: 一、當分區表第一次被訪問時,不管該次訪問須要操做多少個分區,都須要訪問該分區表上全部分區,致使性能問題。當分區表上分區數量較大時,可能會由於打開文件數量超過參數open_file_limit限制而出錯。 二、在對分區表進行維護時,須要同時維護原分區文件和新分區文件,如將分區表由100分區擴展至101分區時,須要2*100+2*101=402個文件描述符。 在MySQL 5.7.9版本中,InnoDB引入本地分區策略,由InnoDB存儲引擎層內部管理訪問分區錶行爲。 在MySQL 5.7.17版本中,MySQL將通用分區策略標記爲棄用 在MySQL 8.0版本,再也不容許MyISAM引擎使用分區表,由於MyISAM引擎不支持本地分區策略。 目前僅有InnoDB和NDB兩種存儲引擎支持本地分區策略。
MySQL 5.7分區加強服務器
MySQL 5.7分區加強: 一、MySQL 5.7.1開始支持HANDLER語句(非標準SQL語句,不支持DML操做,經過指定索引來訪問數據,下降優化器解析和優化SQL的開銷,提高查詢性能。) 二、MySQL 5.7.2開始子分區支持ANALYZE/CHECK/OPTIMIZE/REPAIR/TRUNCATE操做 三、MySQL5.7.3支持index condition pushdown(ICP)特性 四、MySQL 5.7.4爲InnoDB表分區支持FLUSH TABLES FOR EXPORT選項 五、支持使用緩存來提高Load data的性能,每一個分區使用130KB緩衝區 六、支持使用CACHE INDEX和LOAD INDEX INTO CACHE語句對分區的MyISAM表支持索引緩存
分區表優勢數據結構
在MySQL Server層分區表爲一個表,而在MySQL存儲引擎層分區表是多個表,所以有以下特色: 一、分區表對業務透明,只須要維護一個表的數據結構。 二、DML操做加鎖僅影響操做的分區,不會影響未訪問分區。 三、經過分區交換快速將數據換入和換出分區表。 四、經過TRUNCATE操做快速清理特定分區數據。 五、經過強制分區僅訪問特定分區數據,減小操做影響。 六、經過大數據量分區能有效下降索引層數,提升查詢性能。
分區表缺點運維
因爲分區表在MySQL Server層爲一個表,所以: 一、DDL操做須要鎖定全部分區,致使全部分區上操做都被阻塞。 二、當表數據量較小時,分區表和非分區表性能相近,分區表效果有限。 三、當表數據量較大時,對分區表進行DDL或其餘運維操做難度大風險高。 四、分區表使用較少,存在未知風險多,BUG多BUG多BUG多,MySQL社區版本免費,橫向擴展成本低,分庫分表實現簡單且中間件完善。
五、當單臺服務器性能沒法知足時,對分區表進行分拆的成本較高,而分庫分表能很容易實現橫向分拆。
六、當分區表操做不當致使訪問全部分區時,會致使嚴重的性能問題,而分庫分表操做不當僅影響訪問的表。
七、使用分庫分表能夠有效運維下降運維操做影響,對1億數據量表作DDL操做須要謹慎評估,而對10萬數據量表作DDL操做能夠默認其很快完成。
八、使用分庫分表能夠有效減少宕機或其餘故障影響,將數據分庫分表到10套羣集上,一套羣集發生故障僅影響業務的一成。
我的看法性能
對於SQL Server和Oracle這些商業數據庫,因爲商業受權致使橫向擴展成本較高,且分區表功能穩定,所以經過硬件擴展和分區來承擔大數據量帶來的負載,而對於MySQL,互聯網企業有資源有能力將不少需求遷移到數據庫外部實現,所以更追求MySQL使用過程當中的簡單穩定可靠,且經過堆服務器+分庫分表更能有處理數據量爆炸式增加帶來的性能問題。大數據