91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mysql分庫分表的概念

發布時間:2021-09-16 07:07:02 來源:億速云 閱讀:203 作者:chen 欄目:大數據

這篇文章主要講解了“Mysql分庫分表的概念”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Mysql分庫分表的概念”吧!

分庫分表的方式一般有兩種:垂直拆分和水平拆分。接下來我們可以分別看看這兩種分庫分表方式:
垂直拆分
垂直拆分主要有兩種:垂直分庫和垂直分表。

垂直分庫:
垂直分庫其實邏輯上會更容易理解,比如目前我數據庫有用戶相關的表如用戶表,積分表,實名認證表,還有訂單相關的比如商品表,拼團表,還有商品相關的商品表。如果全部表全部放在同一個數據庫,由于數據庫連接的匱乏以及磁盤IO等影響,所以性能肯定會收到一定的影響。這時候我們可以可以將用戶相關的放在user數據庫,商品相關的放在goods數據庫,訂單相關的放在order數據庫。然后不同的數據庫存放在不同的服務器上,這樣還可以避免因為用戶量越來越多導致數據庫性能受到服務器瓶頸的影響。所以說分庫實際上就是在多個服務器搭建多個不同的數據庫,然后按照不同的業務邏輯將不同的表存放在不同的數據庫。  
垂直分表:
垂直分表主要是表中數據列成百上千的數據表使用的,使用的方案是創建輔助表,將表中數據量較大或者不常用的數據庫移動到輔助表,常用的字段留在原表中,這樣就可以避免我們在查詢大表的時候由于不常用的大字段影響查詢的性能。  

水平拆分
水平拆分也有兩種:水平分表和水平分庫分表。

水平分表:
水平分表和垂直分表區別在于垂直分表針對的是列,將不常用的列拆分到輔助表。而水平分表針對的是表,在同一個數據庫中創建多張一樣的表,比如我們在order數據庫中創建三張訂單表order1order2order3,然后插入訂單時將id3取余,根據不同的值存入不同的訂單表,但是由于水平分表是將數據表存放在同一個數據庫,水平分表可以降低單標的數據量,有助于提高查詢效率。如果業務量很大一樣會受到服務器IO的瓶頸,所以我們一般更經常使用的還是水平分庫分表。
水平分庫分表:  
水平分庫分表實際上就是在多臺不同的機器分別創建數據庫和數據表,比如訂單表我們可以在三臺不同的機器上分別創建order數據庫和order數據表,然后根據一定的邏輯將不同的數據存放到不同機器的數據庫中。一般來說水平分庫分表主要有以下幾種拆分規則:
  • 范圍拆分:比如訂單表通過id拆分,id1100000在服務器aorder數據庫,id100001200000存放在服務器border數據庫,以此類推。

  • 地理拆分:將訂單表按照不同地區將表中的數據拆分到不同服務器的order數據庫中存儲。比如可以按照省份來進行拆分。

  • 取模拆分:取模就是剛才水平分表講到的比如有三個訂單表,可以將id3取余,但是區別在于水平分庫分表是將同樣的數據庫和數據表存放在不同機器,所以說可以有效緩解單機瓶頸問題。

  • 時間拆分:根據時間來拆分表中的數據,可以將表中創建時間超過一年的數據拆分到其他數據庫的order數據庫存儲,原表中只保留被查詢概率較高的數據,而這部分數據往往都是近期才創建的,所以可以通過時間拆分實現冷熱數據分離。

分區

分區是什么意思呢?分區實際上是指同一個數據表中不同行的數據記錄到不同的分區中,每個分區都有一個.idb文件,所以說分區可以幫助我們將一個數據表拆分成幾個更小的部分。Mysql只支持局部索引分區不支持全局分區,mysql每一個分區既保存了數據,又存放了索引。MySQL分區主要分為以下幾種:

  • RANGE分區:RANGE分區主要用于日期列的分區,是基于連續區間的列值來進行分區的。RANGE分區也是最常用的分區方式。

  • LIST分區:LIST分區列的值是散列的,也正是由于分區列的值是散列的所以需要手動定義分區列的值。

  • HASH分區:HASH分區就是通過自定義算法將數據均勻分布到不同分區,保證所有分區中數據大致相同。HASH分區只支持整數分區。

  • KEY分區:key分區使用數據庫自帶函數進行分區。KEY分區可支持BLOBTEXT列之外的數據列分區。


分區注意點
分區主要注意一點,如果要分區的表有主鍵或唯一鍵,則分區表的主鍵/唯一鍵必須包含分區鍵。分區的意義在于將一張大表根據分區條件分割成幾個小表,但是對于數據來說仍然是一張表,可以改善大表的可伸縮性,可管理性,還可以提高數據庫的效率。  

分區的優點

  • 與數據存放在單個磁盤相比,可以存儲更多的數據。

  • 對于那些已經失效的數據,通常可以通過刪除對應的分區,來實現刪除數據,這樣比delete效率更高。

  • 一些查詢可以得到極大的優化,滿足一個給定WHERE語句的數據可以只保存在一個分區內,這樣在查找時就不用查找其他剩余的分區。

  • 涉及聚合函數的查詢,可以進行并行處理。意味著聚合函數查詢可以在每個分區上同時進行,最終結果只需通過總計所有分區得到的結果。


分庫分表產生的問題  
分庫分表可以一定程度去除數據庫的瓶頸,但是不可避免的分庫分表會帶來一部分問題,分庫分表主要有兩個問題:聯表查詢join操作困難和分布式事務的問題。  
聯表查詢
我們一開始單庫多表的情況下使用join聯表操作是非常簡單的,使用一條簡單的sql語句配上join就可以得到我們需要的結果,但是分庫之后我們可能一次查詢無法完成,我們可能需要先去服務器a查詢用戶信息,再去服務器b, c, d分別查詢訂單信息才能完成我們的聯表查詢功能,聯表查詢功能我覺得比較適合的一個邏輯是分別查詢出我們需要的數據,然后代碼方面在service層負責組裝所有數據,最后再返還給客戶端,這樣雖然比較復雜,但是數據庫的性能可以得到最大化。  

分布式事務
進行分庫操作之后,事務操作就變成分布式事務了,而之前在談Redis的時候特提到過分布式,我們都知道涉及到分布式邏輯都是比較復雜的,而且如果使用Mysql自帶的分布式事務管理功能會導致性能大大降低,大概是單庫的一成左右性能,所以方案一般有兩種:使用分布式事務中間件比如Mycat或者在代碼中業務邏輯進行控制,不過如果在代碼中控制,可能會使系統更加復雜,可維護性比較低。  

感謝各位的閱讀,以上就是“Mysql分庫分表的概念”的內容了,經過本文的學習后,相信大家對Mysql分庫分表的概念這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乌珠穆沁旗| 屯昌县| 如皋市| 汝阳县| 大邑县| 九江市| 长丰县| 兴海县| 内江市| 昆山市| 贵港市| 宁海县| 策勒县| 庆安县| 安乡县| 镇沅| 奉新县| 平利县| 白城市| 宾川县| 太谷县| 安图县| 南昌市| 饶平县| 上思县| 福鼎市| 扬中市| 富阳市| 油尖旺区| 富川| 贡觉县| 那坡县| 安吉县| 藁城市| 金阳县| 进贤县| 太白县| 郧西县| 台北县| 旌德县| 汉源县|