一、分表: 水平分表:根據條件把數據分為N個表(例如:商品表中有月份列,則可以按月份進行水平分表)。 使用場景:一張表中數據太多,查詢效率太慢。 當需要同時查詢被水平分表的多張表時: 在兩條SQL語句中間加union,就能把兩表數據合併展示。 union:數據合併時去重。 Union all:數據合 ...
一、分表:
水平分表:根據條件把數據分為N個表(例如:商品表中有月份列,則可以按月份進行水平分表)。
使用場景:一張表中數據太多,查詢效率太慢。
當需要同時查詢被水平分表的多張表時:
在兩條SQL語句中間加union,就能把兩表數據合併展示。
union:數據合併時去重。
Union all:數據合併展示不去重。
垂直分表:將表的欄位拆出來變成一張表,兩表通過外鍵建立一對一關係。
使用場景:有些表記錄數並不多,但是欄位卻很長,表占用空間很大,檢索表時需要執行大量I/O,嚴重降低了性能。
當需要同時用到兩表的數據時,可以通過 left join 進行兩表查詢。
二、分庫:(配置多數據源)
垂直分庫:根據不同業務將不同的表分到不同的資料庫。
水平分庫:將同一張表中的數據分到不同的資料庫中。
三、分區:
表沒變,但是保存表數據的從一個文件被分成了多個文件,用戶感知不到。
分區的作用:
select *f rom dept where id in (1m2,3,4)
從MySQL 5.1 中新增了分區(Partition)功能,優勢也越來越明顯了:
--與單個磁碟或文件系統分區相比,可以存儲更多的數據
--很容易就能刪除不用或者過時的數據
--一些查詢可以得到極大的優化 可以併發查詢
--涉及到 SUM()/COUNT() 等聚合函數時,可以併發進行
--IO吞吐量更大(多台伺服器)
分區的方式:
常見分區方式:
Range(範圍) –基於一個給定的連續空間,把數據分配到不同分區。1-10 11-20
List(預定義列表) –類似Range分區,區別在List分區是基於枚舉出的值列表分區,而 Range分區是根據給定的連續區間範圍分區 1,2,3 4,5,6
Hash(哈希)–這中模式允許通過對錶的一個或多個列的Hash Key進行計算,最後通過這個Hash碼不同數值對應的數據區域進行分區。例如可以建立一個對錶主鍵進行分 區的表。這個根據給定的分區個數,把數據分配到不同的分區。
Key(鍵值)-上面Hash模式的一種延伸,這裡的Hash Key是MySQL系統產生的。