Mysql 表分區和性能
以下內容節選自<Mysql技術內幕InnoDB存儲引擎>
mysql表分區:
分區功能並不是所有存儲引擎都支持的,如CSV、MERGE等就不支持。mysql數據庫支持的分區類型為水平分區(指一張表中不同行的記錄分配到不同的物理文件中),不支持垂直分區(指將同一表中的不同列分配到不同的物理文件中)。此外,mysql數據庫的分區是局部分區索引,一個分區中既存放了數據又存放了索引。
當前Mysql數據庫支持以下幾種類型的分區:
Range分區:行數據基於一個給定連續區間的列值放入分區。Mysql數據庫5.5開始支持Range Columns分區。
List分區:和Range分區類似,只是List分區面向的是離散的值。Mysql數據庫5.5開始支持List Columns分區。
Hash分區:根據用戶自定義的表達式的返回值來進行分區,返回值不能為負數。
Key分區:根據Mysql數據庫提供的哈希函數來進行分區。
分區和性能:
數據庫應用分為兩類:一類是OLTP(在線事務處理),如博客、電子商務、網遊等;另一類是OLAP(在線分析處理),如數據倉庫、數據集市。
對於OLAP的應用,分區的確可以很好的提高查詢性能,因為OLAP應用的大多數查詢需要頻繁的掃描一張很大的表,如果進行分區則只需要掃描相應的部分即可。
而對於OLTP應用一般情況下不可能獲取一張大表中10%的數據,大部分都是通過索引返回若幹記錄。對於一張大表,一般的B+樹需要2~3次磁盤IO。舉個列子,一張數據量為1000萬行的表B+樹高度為3,將他分為10個區,100萬行的B+樹高度是2。單獨對於Key索引的查詢在基於分區設計的情況下查詢開銷為2次IO,而原表設計需要2到3次IO。而如果對於其他列索引的查詢就可能需要10 * 2 = 20次IO。分區查詢耗時將遠遠大於沒有進行分區設計數據表的查詢耗時。
結論:
分區並不適用於所有的應用,應該根據實際情況規劃自己的分區設計。
Mysql 表分區和性能