日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql为什么要分库_我们为什么要分库分表

發布時間:2025/3/20 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql为什么要分库_我们为什么要分库分表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當一張表的數據達到幾千萬時,查詢一次所花的時間會變長。這時候,如果有聯合查詢的話,可能會卡死在那兒,甚至把系統給拖垮。

而分庫分表的目的就在于此:減小數據庫的負擔,提高數據庫的效率,縮短查詢時間。另外,因為分庫分表這種改造是可控的,底層還是基于RDBMS,因此整個數據庫的運維體系以及相關基礎設施都是可重用的。

目前我們系統將近20億數據,每張表最大的接近600w條/表,每條數據大約3k,每個表將近1.5G的數據。查詢經常超時,單條SQL執行count(*)查詢時間達到了最大260ms,0.26s(標準是超過0.1s的數據為慢SQL)。

為了說明我們為什么要分庫分表,我們看一下sql的執行過程。

mysql執行一條sql的過程如下:

1、收到sql

2、把sql放到排隊隊列中

3、執行sql

4、返回結果

在這個執行過程中最花時間的地方在于:

1.排隊等待的時間,

2.sql的執行時間。

如果有2個sql都要同時修改同一張表的同一條數據,mysql對這種情況的處理是:一種是表鎖定(MyISAM存儲引擎),一個是行鎖定(InnoDB存儲引擎)。

表鎖定表示其他操作都不能對這張表進行操作,必須等當前對表的操作完才行。行鎖定也一樣,別的sql必須等這條數據操作完了,其他人才能對這條數據進行操作。

如果數據太多,一次執行的時間太長,等待的時間就越長,這也是我們為什么要分表的原因。

分庫分表術語:

讀寫分離:?不同的數據庫,同步相同的數據,分別只負責數據的讀和寫;

分區:指定分區列表達式,把記錄拆分到不同的區域中(必須是同一服務器,可以是不同硬盤),應用看來還是同一張表,沒有變化;

分庫:一個系統的多張數據表,存儲到多個數據庫實例中;

分表:?對于一張多行(記錄)多列(字段)的二維數據表,又分兩種情形:

垂直分表: 豎向切分,不同分表存儲不同的字段,可以把不常用或者大容量、或者不同業務的字段拆分出去;水平分表(最復雜): 橫向切分,按照特定分片算法,不同分表存儲不同的記錄。在實際生產中,通常的進化過程是:單庫單表->單庫多表->多庫多表;;分區->分表->分庫(垂直分庫 - 水平分庫 - 讀寫分離)

單庫單表

單庫單表是最常見的數據庫設計,例如,有一張訂單表(order)放在數據庫中,所有的訂單都可以在order表中查到。

單庫多表

隨著訂單數量的增加,order表的數據量會越來越大,當數據量達到一定程度的時候,對order表的查詢會變慢,從而影響整個DB的性能。

另外,隨著需求的迭代,如果增加添加一列的時候,mysql會鎖表,期間所有的讀寫操作只能等待,別無他法。

這時候,可以將order進行水平的切分,產生多個表結構完全一樣的order表。比如:order_01,order_02....,order_n,那么order_01+order_02+order_n的數據是一份完整的訂單數據。

這個水平切分,簡單的做法如:

按數量切分,1~1000的存在第一張表,1001~2000存在第二張表;

按時間切分,比如:2019年1月份存在第一張表,2019年2月份存在第二張表;還可以按照id的哈希值進行切分,等等等等

多庫多表

隨著數據量增加,單臺數據庫的硬件存儲不夠了,并且,隨著查詢量的增加,單臺數據庫服務器已經沒辦法支撐。這時候就需要對數據庫進行水平區分。

比如按地區分庫,一個省份在一個物理數據庫等等

任何事情都有兩面性,分庫分表也不例外,如果采用分庫分表,會引入新的的問題

1.分布式事務問題

做了垂直分庫或者水平分庫以后,就必然會涉及到跨庫執行SQL的問題,就會引發互聯網界的老大難問題-"分布式事務"。那么要如何解決這個問題呢?

使用分布式事務中間件使用MySQL自帶的針對跨庫的事務一致性方案(XA),不過性能要比單庫的慢10倍左右。能否避免掉跨庫操作(比如將用戶和商品放在同一個庫中)2.跨庫join的問題

分庫分表后,表之間的關聯操作將受到限制,就無法join位于不同分庫的表,也無法join分表粒度不同的表, 結果原本一次查詢能夠完成的業務,可能需要多次查詢才能完成。

那么要如何解決這個問題呢?

簡單的解決方法:

全局表:基礎數據,所有庫都拷貝一份。字段冗余:把需要join的字段冗余在各個表中,這樣有些字段就不用join去查詢了。系統層組裝:應用端先分別查詢出所有復核條件的,然后在應用端組裝起來,類似于一個mapreduce的過程(較復雜)。3.橫向擴容的問題

當我們使用哈希取模做分表的時候,針對數據量的遞增,可能需要動態的增加表,此時就需要考慮數據遷移的問題。

原來使用的是hash后對8進行取模,那么,數據是均分在8個表(庫)上。

如果8個表不夠的時候,我們要擴展到16個表,這時候,我們hash后對16取模,新數據是沒有問題的,舊數據就會發生錯亂。

如果哈希后是9,那么,原來我們對8取模后,是1,會到表1進行查詢;但是,現在我們是對16取模,那么是到表9進行查詢的,而這個數據在表9又不存在,因此,就會找不到數據了

4.結果集合并、排序的問題

因為我們是將數據分散存儲到不同的庫、表里的,當我們查詢指定數據列表時,數據來源于不同的子庫或者子表,就必然會引發結果集合并、排序的問題。

如果每次查詢都需要排序、合并等操作,性能肯定會受非常大的影響。

上面列出了分庫分表的常見的一些,總的來說:

能不切分盡量不要切分,如果沒有達到幾百萬,通常無需分庫分表如果一定要切分,一定要選擇合適的切分規則,提前規劃好。如果一定要切分,盡量通過數據冗余或表分組來降低跨庫 Join 的可能。對于現在市面上有好幾種數據庫中間件,這些中間件對數據 Join 實現,個中滋味,只能自己體會。業務讀取盡量少使用多表 Join。數據盡可能的比較均勻分布數據到各個節點上

總結

以上是生活随笔為你收集整理的mysql为什么要分库_我们为什么要分库分表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。