您好,登錄后才能下訂單哦!
本篇文章為大家展示了SQL中怎么實現分庫分表,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
方案1:
通過提升服務器硬件能力來提高數據處理能力,比如增加存儲容量、CPU等,這種方案成本很高,并且如果瓶頸在
MySQL本身那么提高硬件也是有很的。
方案2:
把數據分散在不同的數據庫中,使得單一數據庫的數據量變小來緩解單一數據庫的性能問題,從而達到提升數據庫性能的目的,如下圖:將電商數據庫拆分為若干獨立的數據庫,并且對于大表也拆分為若干小表,通過這種數據庫拆分的方法來解決數據庫的性能問題。
分庫分表就是為了解決由于數據量過大而導致數據庫性能降低的問題,將原來獨立的數據庫拆分成若干數據庫組成,將數據大表分成若干數據表組成,使得單一數據庫、單一數據表的數據量變小,從而達到提升數據庫性能的目的。
分庫分表包括分庫和分表兩個部分,在生產中通常包括:垂直分庫、水平分庫、垂直分表、水平分表四種方式。
垂直分表
下邊通過一個商品查詢的案例來垂直分表:
通常在商品列表中是不是顯示商品詳情信息的。
用戶在瀏覽商品列表時,只有對某商品感興趣時才會查看商品的詳細描述。因此,商品信息中商品描述字段訪問頻次較低,且該字段存儲占用空間較大,訪問單個數據IO時間較長;商品信息中商品名稱、商品圖片、商品價格等其他字段數據訪問頻次較高。
由于這兩種數據的特性不一樣,因此他考慮將商品信息表拆分如下:
將訪問頻次低的商品描述信息單獨存放在一張表中,訪問頻次較高的商品基本信息單獨放在一張表中。
商品列表可采用以下sql:
SELECTp.*,r.[地理區域名稱],s.[店鋪名稱],s.[信譽]FROM[商品信息]p
LEFTJOIN[地理區域]rONp.[產地]=r.[地理區域編碼]LEFTJOIN[店鋪信息]sONp.id=s.[所屬店鋪]WHERE...ORDERBY...LIMIT...
需要獲取商品描述時,再通過以下sql獲取:
SELECT*
FROM[商品描述]WHERE[商品ID]=?
小明進行的這一步優化,就叫垂直分表。
垂直分表定義:將一個表按照字段分成多表,每個表存儲其中一部分字段。
它帶來的提升是:
1.為了避免IO爭搶并減少鎖表的幾率,查看詳情的用戶與商品信息瀏覽互不影響。
2.充分發揮熱門數據的操作效率,商品信息的操作的高效率不會被商品描述的低效率所拖累。
注意:
為什么大字段IO效率低:
第一是由于數據量本身大,需要更長的讀取時間;
第二是跨頁,頁是數據庫存儲單位,很多查找及定位操作都是以頁為單位,單頁內的數據行越多數據庫整體性能越好,而大字段占用空間大,單頁內存儲行數少,因此IO效率較低。
第三,數據庫以行為單位將數據加載到內存中,這樣表中字段長度較短且訪問頻率較高,內存能加載更多的數據,命中率更高,減少來磁盤IO,從而提升來數據庫性能。
一般來說,某業務實體中的各個數據項的訪問頻次是不一樣的,部分數據項可能是占用存儲空間比較大的BLOB或是TEXT。例如上例中的商品描述。所以,當表數據量很大時,可以將表按字段切開,將熱門字段、冷門字段分開放置在不同庫中,這些庫可以放在不同的存儲設置上,避免IO爭搶。垂直切分帶來的性能提升主要集中在熱門數據的操作效率上,而且磁盤爭用情況減少。
通常我們按以下原則進行垂直拆分:
1、把不常用的字段單獨放在一張表;
2、把text,blob等大字段拆分出來放在附表中;
3、經常組合查詢的列放在一張表中;
上述內容就是SQL中怎么實現分庫分表,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。