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