水平分表与垂直分表
1. 水平分表
(1) 什么是水平分表
水平分表就是指以行為單位對數據進行拆分,一般意義上的分庫分表指的就是水平分表。
分表之后,所有表的結構都是一樣的。
(2) 為什么要水平分表
水平分表可以解決表中的數據量大的問題,如果一張表的數據太多,操作起來會很麻煩,所以分表存儲數據。
(3) 如何進行水平分表
一般可以有范圍法和hash法來進行水平分表。
假設現在有30萬行數據,需要對它們進行水平分表:
范圍法很好理解,可以讓第1-100000行數據存放在表1,第100001-200000行數據存放在表2,第200001-300000行數據存放在表3,就完成了水平分表。
hash法也不難理解,就是選擇一個合適的hash函數,比如說使用取模操作(%),把%3結果為0的數據存放在表1,結果為1的存放在表2,結果為2的存放在表3即可。
2. 垂直分表
(1) 什么是垂直分表
垂直分表就是把一張表按列分為多張表,多張表通過主鍵進行關聯,從而組成完整的數據。
分表之后,每張表的結構都不相同。
(2) 為什么要垂直分表
這主要跟某些數據庫的引擎有關,比如Mysql的InnoDB引擎。
在Mysql中,數據的基本單位,稱為行?(Row)
管理數據的基本單位,稱為頁?(Page)
保存頁的單位,稱為區?(Extent)
一個區由連續的頁組成,一個頁由連續的行組成
默認每一個區的大小為1M,默認每一頁的大小為16K,所以一個區有1024 / 16 = 64個頁
而每個頁中,根據每行數據的大小,又可以存儲多個行
然而,在InnoDB 1.0版本之后,引入了一個新特性:壓縮頁
被壓縮之后的頁在實際占用空間上,比邏輯上的要小,但是在壓縮和解壓縮時會花費額外的時間
這時如果出現了跨頁檢索數據,效率就會比較低
因此,在表設計時,盡可能的在頁內多存儲數據行,這樣可以減少跨頁檢索,提高效率。
而多存儲數據行就意味著,每一行的列數要盡可能少。
(3) 如何進行垂直分表
如果直接每個表就只存儲一兩列的話
這樣做不僅會造成表過多,而且會產生大量重復字段(比如主鍵),在查詢時還需要不斷地進行多表關聯
所以,如何進行垂直分表還是有技巧的。
一般來說,垂直分表并不會把列平分到2個表中,而是會將一些重要的字段單獨剝離成小表,把剩余的不太重要的字段放在大表中。
比如,把查詢、排序時需要的字段,高頻訪問的小字段放在小表
而把低頻訪問字段以及一些大字段放在大表中
總結
- 上一篇: LCD液晶显示屏常见类型和接口
- 下一篇: 【Linux】linux的网络配置(动态