Terms of MySQL Scalability

scale up 垂直擴展
scale out 水平擴展

replication

同樣的資料被複製好幾份到不同的機器上
這個動作就叫做 replication
replication 只能解決讀的問題
寫的瓶頸還是在 master

有 master-slave 這種架構
只有 master 才能寫,而 slave 只能讀
所謂的「讀寫分離」

也有像 MariaDB Galera Cluster 這種 multi-master 的架構
就是每一台都能讀,也能寫

partitioning

把原本在同一台機器上的數據拆分到多台機器
以減少單一機器的負載

分庫
把整個表獨立出來放到另一台機器
自己一個資料庫

分表
分為「垂直拆分」和「水平拆分」
拆出來的表可以在同一台機器上
也可以是在另一台機器上(就會是另一個資料庫,分庫)
通常都會同時採用分庫和分表

vertical partitioning

把原本一個表的 schema 拆成多個表
例如把「文章內文」這個欄位從 Article 表中拆出來
變成 ArticleContent 表
也就是說垂直拆分拆出來的表的 schema 會不一樣
有一點 denormalization 的意味

直接把整個表拆出來放到另一台資料庫也是垂直拆分
例如:
PlayRecord 表獨立出來放到 warehouse 這個資料庫
User 相關的表自己一個資料庫
Photo 相關的表也自己一個資料庫

垂直拆分其實沒有解決單一表中存在太多 record 的問題

horizontal partioning == sharding

把原本一個表的 record 依據一個 shard key
拆分到不同的表(但是 schema 都一樣)
例如:
id % 3 = 0 的 record 存到 A 表
id % 3 = 1 的 record 存到 B 表
id % 3 = 2 的 record 存到 C 表

困難的點在於如何橫跨多個表產生一個 unique 的 id
以及多增加一個表之後的數據遷移

ref:
http://j.mp/1HwmOLZ << MySQL 性能调优与架构设计.pdf

不論是垂直拆分還是水平拆分
拆了之後就會遇到沒辦法 JOIN 和 ORDER BY 的問題
解決的辦法基本上就是改成在 application 層做