前面幾篇討論如何透過多台主機突破運算力限制,接著來談談如何切分資料存放在多台主機。資料太多怎麼辦?切!切分方式分成水平和垂直兩種,垂直切分 (vertical partition) 是將部分結構切割出去成為獨立的實體;水平切分(horizontal partition, sharding) 則是每一筆資料仍有完整的內容,但不同筆資料可能存放在不同地方,通常是在不同主機。
需要注意的是在看文章或討論時 partition 和 sharding 滿常混用的,務必留意前後文避免誤會。
當資料被切分後就可以分開存放,最理想的情況是每一次的查詢都只要讀取一次,不必跨表也不用跨主機,因此切分資料的策略就很重要了。如果一筆資訊中,部分的欄位常常被一起存取,其他欄位則否,這種情形適合垂直切分,將一個大結構依照常用的欄位切分成幾個小結構。
Id | 姓名 | 性別 | 生日 | 電話 | 自介 | 興趣 | 是否接收推播通知 | 職業 | 年資 | |
---|---|---|---|---|---|---|---|---|---|---|
1 | Andy | M | 1990.01.01 | andy@mail.com | 123456 | 嗨~我是安迪! | 打電動 | True | 業務 | 3年 |
2 | Betty | F | 1990.01.01 | betty@mail.com | 123456 | 嗨~我是Betty! | 看電影 | True | 作家 | 7年 |
3 | Cathy | F | 1990.01.01 | cathy@mail.com | 123456 | 嗨~我是凱西! | 唱歌 | False | 警察 | 5年 |
4 | Dan | M | 1990.01.01 | dan@mail.com | 123456 | 嗨~我是丹! | 露營 | True | 外送員 | 2年 |
例如上面的會員資訊表,在系統中多數畫面顯示的只有姓名、性別和Email,其餘欄位就可以切割出去成為另一張表。
Id | 姓名 | 性別 | |
---|---|---|---|
1 | Andy | M | andy@mail.com |
2 | Betty | F | betty@mail.com |
3 | Cathy | F | cathy@mail.com |
4 | Dan | M | dan@mail.com |
Id | 生日 | 電話 | 自介 | 興趣 | 是否接收推播通知 | 職業 | 年資 |
---|---|---|---|---|---|---|---|
1 | 1990.01.01 | 123456 | 嗨~我是安迪! | 打電動 | True | 業務 | 3年 |
2 | 1990.01.01 | 123456 | 嗨~我是Betty! | 看電影 | True | 作家 | 7年 |
3 | 1990.01.01 | 123456 | 嗨~我是凱西! | 唱歌 | False | 警察 | 5年 |
4 | 1990.01.01 | 123456 | 嗨~我是丹! | 露營 | True | 外送員 | 2年 |
若是進行水平切分則會依切分策略拆成數張不同的表。
Id | 姓名 | 性別 | 生日 | 電話 | 自介 | 興趣 | 是否接收推播通知 | 職業 | 年資 | |
---|---|---|---|---|---|---|---|---|---|---|
1 | Andy | M | 1990.01.01 | andy@mail.com | 123456 | 嗨~我是安迪! | 打電動 | True | 業務 | 3年 |
Id | 姓名 | 性別 | 生日 | 電話 | 自介 | 興趣 | 是否接收推播通知 | 職業 | 年資 | |
---|---|---|---|---|---|---|---|---|---|---|
2 | Betty | F | 1990.01.01 | betty@mail.com | 123456 | 嗨~我是Betty! | 看電影 | True | 作家 | 7年 |
3 | Cathy | F | 1990.01.01 | cathy@mail.com | 123456 | 嗨~我是凱西! | 唱歌 | False | 警察 | 5年 |
Id | 姓名 | 性別 | 生日 | 電話 | 自介 | 興趣 | 是否接收推播通知 | 職業 | 年資 | |
---|---|---|---|---|---|---|---|---|---|---|
4 | Dan | M | 1990.01.01 | dan@mail.com | 123456 | 嗨~我是丹! | 露營 | True | 外送員 | 2年 |
再搭配上 Master-Slave 就會變成下面的架構。