水平分表
阿新 • • 發佈:2021-11-21
一、概念
水平分表:是為了解決單表記錄資料過大引起的效率問題,通過HASH、分段等手段拆分,將大表化小的手段。
垂直分表:是將寬表變成幾個窄表的手段,幾個拆分前後的資料記錄數未改變。通過將少量的重要欄位剝離到窄表,讓每個頁容納更多的行,減少跨頁檢索,減小磁碟掃描範圍,達到提高效率的目的。
- 何時進行垂直拆分:
1.單表資料總量可能過千萬。
2.欄位超過20個
3.包含超長varchar、text、clob、blob等較佔空間的型別欄位。
- 哪些欄位適合放在小表:
1.資料查詢條件、排序用到的欄位:商品id、商戶id、分類編號、品牌編號、邏輯刪除欄位等。
2.高頻訪問的小子段:商品名、子標題、廠家資訊、價格。
- 哪些欄位適合放在大表:
1.低頻訪問欄位:配送資訊、售後申明、最後更新時間。
2.大欄位:圖文詳情、圖片Base64、Json元資料(特殊情況下某個大欄位就需要單獨存到一個表)。
二、innodb管理資料的機制:
row -> page(16KB) -> extent(1MB) -> segment -> table_space;
row:行,就是一條記錄。
page:頁,磁碟儲存,固定大小為16KB,根據行資料大不同大小,儲存若干連續的行。
extent:區,固定大小為1MB,也就是一個區只能儲存64個連續的頁。
segment:段。
table_space:表空間。
innodb1.0後提供了壓縮頁的技術,可以讓每頁物理上儲存更多的邏輯資料。跨頁檢索資料時的解壓縮效率不算高,所以做表設計時,要儘量的在一個頁中儲存更多的行資料,來減少跨頁檢索的次數,來提高資料檢索效率。
垂直拆分前:每行佔1KB,需要625萬頁來儲存。
垂直拆分後:每行佔64B,只需要39萬頁來儲存。
查詢時需要檢索的資料頁數相差16倍。