激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - 數據庫技術 - 分庫分表的垂直切分與水平切分看這篇就夠了!

分庫分表的垂直切分與水平切分看這篇就夠了!

2022-01-07 22:21零零后程序員小三003 數據庫技術

分庫分表:在一些數據庫大的項目中,隨著時間的推移和業務量的增加,數據庫里的表中數據就會越來越多,如果單單還使用上面的模式,顯然是不夠用的。

分庫分表的垂直切分與水平切分看這篇就夠了!

哈嘍大家好呀!我是小三。今天來講分庫分表:)

什么是分庫分表

分庫分表:在一些數據庫大的項目中,隨著時間的推移和業務量的增加,數據庫里的表中數據就會越來越多,如果單單還使用上面的模式,顯然是不夠用的。這時候就想到了把一個庫里的數據分散到多個庫里,并且把存在一個表里的數據分散到多個表里。

「分庫分表的方式有垂直切分,水平切分

分庫分表的垂直切分與水平切分看這篇就夠了!

分庫分表能帶來什么樣的好處

第一、能解決數據庫本身的瓶頸,當連接數過多時,就會出現‘too many connections’的錯誤,這種訪問量 太大或者是數據庫設置的最大連接數太小的原因。mysql的默認的最大連接數是100,可以進行修改,而mysql服務允許最大的連接數為16384。數據庫分表可以解決單表海量數據的查詢性能問題,數據庫分庫可以解決單臺數據庫的并發訪問壓力問題。

第二、解決系統本身的IO、CPU瓶頸。磁盤讀寫IO瓶頸:熱點數據量很多的情況下,盡量使用了數據庫本身的緩存,但是依舊有大量IO,導致sql執行速度慢。網絡IO瓶頸:請求的數據太多,數據傳輸量大了,網絡帶寬就顯得不夠用了,鏈路的響應時間就變長了。CPU瓶頸,在進行基礎的數據量大單機復制SQL計算的時候,SQL語句執行占用CPU的使用率就會變高,不單只這種原因,也有掃描行數大、鎖沖突、鎖等待等等原因。

可以通過show processlist; 、show full processlist,發現 CPU 使用率比較高的SQL。常見的對于查詢時間長,State 列值是 Sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result,Using filesort 等都是可能有性能問題SQL,清楚相關影響問題的情況可以kill掉。也存在執行時間短,但是CPU占用率高的SQL,通過上面命令查詢不到,這個時候最好通過執行計劃分析explain進行分析

什么時候考慮使用分庫分表呢?

能不使用分庫分表就盡量不使用分庫分表,并不是所有的表都需要進行切分的,主要還是看數據的增長速度。切分后是對在某一些成都市提高了業務的復雜程度,數據庫除了承載數據的存儲和查詢以外,能更好的協助業務實現需求也是重要的工作。

不到萬不得已不要輕易使用分庫分表,避免“過度設計”和“過早優化”。在進行分庫分表之前,不要是因為想分而分,更是要先去做力所能及的事情,比如說:給硬件升級、給網絡升級、讀寫分離等等。數據量達到單表的瓶頸時在考慮使用分庫分表。

數據量過大會影響業務的正常訪問,對數據庫的備份如果是單表很大的話,備份的時候就需要大量的磁盤IO和網絡IO。對一個很大的表進行DDL修改的時候,Mysql會鎖住全表,這個時間會挺長,這個時間段里業務是不能訪問這個表的,造成的影響會很大。因為數據量大的表會經常訪問與更新,這種情況就會有可能出現鎖的等待。這時候將數據進行切分,用空間換時間,降低訪問壓力。

安全性和可用性,在業務的層面進行垂直切分的話,將不相關的數據庫來進行分隔,因為的話每個業務的數據量,訪問量都不一樣,不能因為一個業務就把數據庫搞掛掉牽連到其他的業務。利用水平切分的話,當一個數據庫出現了問題,不會影響到全部的用戶,因為每個庫只承擔了業務的一小部分數據,這樣的整體可用性就可以得到提高。

「Mysql數據庫垂直分表講解」

垂直分表也就是把“大表拆成小表”,基于列字段進行的。拆分的原則一般是表中的字段較多,將不常用的或者是數據較大,長度較長的拆分到擴展表里,如text類類型字段。把訪問頻次低、字段大的商品描述信息單獨的放在一張表里,訪問頻次較為多的商品基本信息單獨的放在一張表里。

垂直拆分的原則:把不常用的字段單獨的放在一張表里,把大字段拆分出來放在附表中,把業務經常組合查詢的列放在一張表中。

為什么大字段的IO效率低下呢?

第一點就是由于數據量本身的龐大的,需要更長的讀取時間;第二點就是跨頁,也是數據庫的存儲單位,很多操作包括查找這些都是以頁為單位的,單頁里的數據行越多的話數據庫的整體性能就越好,并且的話字段大所占用的空間也大,單頁內的存儲行數少,所以IO效率就較為低下;第三就是數據庫以行為單位把數據加載到內存當中,這樣的話表里的字段長度較為短并訪問的頻率高,內存就能加載到了更多的數據,命中率就更高了,減少了磁盤的IO,提升了數據庫的性能。

  1. //拆分前
  2. CREATE TABLE `product` (
  3. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  4. `title` varchar(524) DEFAULT NULL COMMENT '視頻標題',
  5. `cover_img` varchar(524) DEFAULT NULL COMMENT '封面圖',
  6. `price` int(11) DEFAULT NULL COMMENT '價格,分',
  7. `total` int(10) DEFAULT '0' COMMENT '總庫存',
  8. `left_num` int(10) DEFAULT '0' COMMENT '剩余',
  9. `learn_base` text COMMENT '課前須知,學習基礎',
  10. `learn_result` text COMMENT '達到水平',
  11. `summary` varchar(1026) DEFAULT NULL COMMENT '概述',
  12. `detail` text COMMENT '視頻商品詳情',
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  15. //拆分后
  16. CREATE TABLE `product` (
  17. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  18. `title` varchar(524) DEFAULT NULL COMMENT '視頻標題',
  19. `cover_img` varchar(524) DEFAULT NULL COMMENT '封面圖',
  20. `price` int(11) DEFAULT NULL COMMENT '價格,分',
  21. `total` int(10) DEFAULT '0' COMMENT '總庫存',
  22. `left_num` int(10) DEFAULT '0' COMMENT '剩余',
  23. PRIMARY KEY (`id`)
  24. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  25. CREATE TABLE `product_detail` (
  26. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  27. `product_id` int(11) DEFAULT NULL COMMENT '產品主鍵',
  28. `learn_base` text COMMENT '課前須知,學習基礎',
  29. `learn_result` text COMMENT '達到水平',
  30. `summary` varchar(1026) DEFAULT NULL COMMENT '概述',
  31. `detail` text COMMENT '視頻商品詳情',
  32. PRIMARY KEY (`id`)
  33. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Mysql數據庫垂直分庫講解

垂直分庫是針對的是一個系統中不同業務進行拆分的,數據庫的連接資源比較寶貴并且單機的處理能力也是有限的。在沒拆分之前全部都是落到單一的庫上的,這時候單庫的處理能力有瓶頸,與之還有的是磁盤的空間、內存、tps等限制。拆分之后,避免不同庫競爭同一個物理機上的CPU、內存/網絡IO、磁盤,所以在高并發的場景下,垂直分庫一定程度上能夠突破IO、連接數及單機硬件資源的瓶頸。垂直分庫可以更好的解決業務層面的耦合,業務清晰并且方便管理和維護。一般從單體項目升級改造成為微服務項目的話,那就是垂直分庫。

分庫分表的垂直切分與水平切分看這篇就夠了!

Mysql數據庫水平分表

水平分表都是大表拆小表,垂直分表是按表結構進行拆分,水平分表是按數據結構進行拆分。把一個表的數據分到一個數據庫的多張表里,每個表只有這個表的部分數據,其核心就是把一個大表分割成多個小表,每一個的結構是一樣的,數據不一樣,全部表的數據合起來就是全部的數據,針對數據量巨大的單張表(比如訂單表)照某種規則(RANGE,HASH取模等),切分到多張表里面去。但是這些表還是在同一個庫中,所以單數據庫操作還是有IO瓶頸,主要是解決單表數據量過大的問題。減少鎖表時間,沒分表前,如果是DDL(create/alter/add等)語句,當需要添加一列的時候mysql會鎖表,期間所有的讀寫操作只能等待。

分庫分表的垂直切分與水平切分看這篇就夠了!

Mysql數據庫水平分庫講解

把同個表的數據按照一定的規則分到不同的數據庫里,數據庫在不同的服務器上,水平分庫就是把不同的表拆分到不同的數據庫里,它是對數據的行拆分,不會影響表的結構。每個庫的結構都一樣,但是每個庫的數據都不一樣,沒有交集,庫的并集就是全量數據了。但水平分庫的粒度會比水平分表更大。

分庫分表的垂直切分與水平切分看這篇就夠了!

分庫分表總結:

垂直角度(表結構不一樣)

垂直分表: 將一個表字段拆分成多個表,每個表存儲部分字段。好處是避免IO時鎖表的次數,分離熱點字段和非熱點字段,避免大字段IO導致性能下降。原則是業務經常組合查詢的字段一個表;不常用字段一個表;text、blob類型字段作為附屬表

垂直分庫:根據業務將表分類放到不同的數據庫服務器上,好處是避免表之間競爭同個物理機的資源,比如CPU/內存/硬盤/網絡IO,原則是根據業務相關性進行劃分,領域模型,微服務劃分一般就是垂直分庫。

水平角度(表結構一樣)

水平分庫:把同個表的數據按照一定規則分到不同的數據庫中,數據庫在不同的服務器上。好處:是多個數據庫,降低了系統的IO和CPU壓力。原則是選擇合適的分片鍵和分片策略,和業務場景配合;避免數據熱點和訪問不均衡、避免二次擴容難度大

水平分表:同個數據庫內,把一個表的數據按照一定規則拆分到多個表中,對數據進行拆分,不影響表結構。好處是單個表的數據量少了,業務SQL執行效率高,降低了系統的IO和CPU壓力。原則是選擇合適的分片鍵和分片策略,和業務場景配合;避免數據熱點和訪問不均衡、避免二次擴容難度大

原文鏈接:https://mp.weixin.qq.com/s/4S3IdB8eh_MHbYULQuja4g

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一区二区国产 | 欧美成人激情 | 亚洲一区二区在线视频 | 黄色免费影片 | 国产精品观看在线亚洲人成网 | 91婷婷射| 久久撸视频 | 久久久久在线观看 | 亚洲成人入口 | 国产视频精品在线 | japanesexxxx24videofree | 经典三级在线视频 | 韩国美女一区 | 日本高清电影在线播放 | 九草在线 | 亚洲天堂在线电影 | 久久精品亚洲国产奇米99 | 高清做爰免费无遮网站挡 | 成人免费午夜视频 | 国产一区二区精彩视频 | 久久2019中文字幕 | 久久久久国产成人免费精品免费 | 色综合网在线观看 | 老子午夜影院 | 欧美一级做a | 亚洲无av| 一色视频 | 成人毛片视频免费看 | 综合网日日天干夜夜久久 | 精品国产一区二 | 又黄又爽免费无遮挡在线观看 | www中文在线| 一夜新娘第三季免费观看 | 国产伦精品一区二区三区 | 国产成人在线播放视频 | 久久成人免费网站 | 日本黄色片免费播放 | 欧美亚洲黄色 | 免费a视频在线观看 | 免费在线观看中文字幕 | 中文字幕在线一 |