提升MySQL大數據效能(Partition)
隨著使用的時間、資料庫的資料會日漸提升,慢慢的效能就會變的很差,所以我們要將大數據的資料表做分割,讓每一個資料表變的小一些、去提升資料庫的查尋效率。
目前分割資料有分二種方式,一種是水平分割(Horizontal Partitioning)、另一種是垂直分割(Vertical Partitioning)。
水平分割(Horizontal Partitioning):
透過資料量做分割,舉個例子,如果現在會員資料有1千萬筆,我們可以透過會員生日的月份資料進行拆分,可以把資切成12個資料表依照會員的生日。
垂直分割(Vertical Partitioning):
透過欄位做分割,如果你資料表有30個欄位,可能有20個欄位比較少被搜尋,我們就可以將那20個欄位切出去獨立一張資料表。
分割模式:(參考資料:http://twpug.net/docs/mysql-5.1/partitioning.html#partitioning-list)
- Range
按照RANGE分區的資料表是通過如下一種方式進行分區的,每個分區包含那些分區資 料表達式的值位於一個給定的連續區間內的行。這些區間要連續且不能相互重疊,使用 VALUES LESS THAN操作符來進行定義。
- Hash
HASH分區主要用來確保數據在預先確定數目的分區中平均分佈。在RANGE和LIST分區中,必須明確指定一個給定的列值或列值集合應該保存在哪個分區中;而在HASH分區中,MySQL 自動完成這些工作,您所要做的只是基於將要被哈希的列值指定一個列值或資料表達式,以及指定被分區的資料表將要被分割成的分區數量。
- Key
按照KEY進行分區類似於按照HASH分區,除了HASH分區使用的用戶定義的資料表達式,而KEY分區的 哈希函數是由MySQL 伺服器提供。
- List
MySQL中的LIST分區在很多方面類似於RANGE分區。和按照RANGE分區一樣,每個分區必須明確定義。它們的主要區別在於,LIST分區中每個分區的定義和選擇是基於某列的值從屬於一個值列資料表集中的一個值,而RANGE分區是從屬於一個連續區間值的集合。LIST分區通過使用「PARTITION BY LIST(expr)」來實現,其中「expr」 是某列值或一個基於某個列值、並返回一個整數值的資料表達式,然後通過「VALUES IN (value_list)」的方式來定義每個分區,其中「value_list」是一個通過逗號分隔的整數列資料表。
更細的資料可以參考Mysql官方網站:http://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html
Sample – 水平分割(Range)
- 目前有一個table叫a01,然後想透過建立資料的時間去切割資料,另外我們把這個table copy出來取名叫a02來做對照組
- 二個table資料都是1340103筆
- a01是有切割partition,花的時間是 1.1sec
- a02是沒切割partition,執行相同的指令跟相同的資料量、花的時間是2.8秒
結論:
在數據快速成長下的資料表,應該是要切partition,但切的時後、也要想清楚是要用什麼條件當成分割點,如果常用到的搜尋資料是跨好幾個partition的話、會變的一點用處都沒有,所以這個是要看當時的狀況跟需求去處理的。
我要留言