天天看點

mysql 表分區性能_Mysql 表分區和性能

以下内容節選自

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。分區查詢耗時将遠遠大于沒有進行分區設計資料表的查詢耗時。

結論:

分區并不适用于所有的應用,應該根據實際情況規劃自己的分區設計。