★針對海量數據的優化主要有兩種方法
(1)大表拆成小表
垂直分表(豎切)---主鍵在每個分表中都會出現
水平分表(橫切)---字段一般穩定,而記錄不穩定
水平分表技術是將一個表拆分成多個表,比較常用的方式是將表中的記錄按照某種Hash算法進行拆分,簡單的拆分方法如取模方式。同樣,這種分區方法也必須對前端的應用程序中的SQL進行修改方可使用。而且對於一個SQL,它可能會修改兩個表,那麼必須得寫成2個SQL語句從而可以完成一個邏輯事務,使得程序的邏輯判斷越來越複雜,這也會導致程序的維護代價增高,也就失去了採用數據庫的優勢。因此,分區技術可以有利地避免如上的弊端,成爲解決海量數據的有利方法
(2)SQL語句的優化
可以通過增加索引等來調整,但是數據量的增大同時也會導致索引的維護代價增大
★mysql分區技術不同於之前的分表技術,它與水平分表有些類似,但是它是在邏輯層進行的水平分表,對於應用程序而言它還是一張表
RANGE分區:基於屬於一個給定的連續區間的列值,把多行分配給分區
PARTITION BY RANGE(store_id)(
PARTITION p0 VALUES LESS THAN(6), 編號1-5的店鋪存放在p0分區(< 6)
PARTITION p1 VALUES LESS THAN(11), 編號6-10的店鋪存放在p1分區
PARTITION p2 VALUES LESS THAN(16), 編號11-15的店鋪存放在p2分區
PARTITION p3 VALUES LESS THAN(21), 編號16-20的店鋪存放在p3分區
)
LIST分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值進行選擇
PARTITION BY LIST(store_id)
(
PARTITION pNorth VALUES IN(3,5,6,9,17),
PARTITION pEast VALUES IN(1,2,10,11,19,20),
PARTITION pWest VALUES IN(4,12,13,14,18),
PARTITION pCentral VALUES IN(7,8,15,16),
)
HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算,這個函數可以包含mysql中有效的、產生非負整數值的任何表達式(平均分配到每個分區,但可能分區與分區之間的數據沒有規律)
PARTITION BY HASH(YEAR(hired))
PARTITIONS 4
;
KEY分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,並且mysql服務器提供其自身的HASH函數
★不同分區技術的對比
分區類型 優點 缺點 共性
RANGE 適合日期類型支持複合分區 有限的分區 一般只針對某一列
LIST 適合有固定取值的列支持複合分區 有限的分區,插入 一般只針對某一列
記錄在這一列的值不在
LIST中,則數據丟失
HASH 線性HASH使得增加、刪除和合並分 線性Hash的數據分佈不 一般只針對某一列
區更快捷 均勻而一般Hash數據分
布較均勻
KEY 列可以爲字符型等其他非Int類型 效率較之前的低,因爲 一般只針對某一列
函數爲複雜的函數
(如.MD5或SHA函數)