1. 程式人生 > >Mysql 表分區和性能

Mysql 表分區和性能

存儲引擎 數據表 平分 數據倉庫 磁盤io 倉庫 hash分區 技術內幕 5.5

以下內容節選自<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 表分區和性能