欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql分表之后如何平滑上線詳解

 更新時(shí)間:2021年10月29日 08:59:29   作者:程序員小飯  
項(xiàng)目開發(fā)中,我們的數(shù)據(jù)庫(kù)數(shù)據(jù)越來越大,隨之而來的是單個(gè)表中數(shù)據(jù)太多,以至于查詢書讀變慢,當(dāng)出現(xiàn)這種情況時(shí),我們可以考慮分表,這篇文章主要給大家介紹了關(guān)于mysql分表之后如何平滑上線的相關(guān)資料,需要的朋友可以參考下

分表的目的

項(xiàng)目開發(fā)中,我們的數(shù)據(jù)庫(kù)數(shù)據(jù)越來越大,隨之而來的是單個(gè)表中數(shù)據(jù)太多。以至于查詢數(shù)據(jù)變慢,而且由于表的鎖機(jī)制導(dǎo)致應(yīng)用操作也受到嚴(yán)重影響,出現(xiàn)了數(shù)據(jù)庫(kù)性能瓶頸。

當(dāng)出現(xiàn)這種情況時(shí),我們可以考慮分表,即將單個(gè)數(shù)據(jù)庫(kù)表進(jìn)行拆分,拆分成多個(gè)數(shù)據(jù)表,然后用戶訪問的時(shí)候,根據(jù)一定的算法,讓用戶訪問不同的表,這樣數(shù)據(jù)分散到多個(gè)數(shù)據(jù)表中,減少了單個(gè)數(shù)據(jù)表的訪問壓力。提升了數(shù)據(jù)庫(kù)訪問性能。

舉個(gè)栗子

比如咱們最常見的用戶表(user表)

id user_id 其他字段
主鍵id 用戶id 其他字段

咱們一般都會(huì)用user_id去查詢對(duì)應(yīng)的用戶信息,但是隨著業(yè)務(wù)的增長(zhǎng),這張表會(huì)越來越大,甚至上億,嚴(yán)重影響了查詢性能。 所以咱們就會(huì)對(duì)這張表進(jìn)行分表處理,分到多張表減小查詢壓力

分表策略

以分10張表為例(具體分多少?gòu)埍?根據(jù)實(shí)際情況來估算) 首先咱們建10張表 user1、user2、user3。。。。。user10

一般情況下,我們都會(huì)用作為索引的字段(user_id)進(jìn)行取模處理。想分多少?gòu)埍?,就按照多少取模,比如這個(gè)case就是10

$table_name = $user_id % 10;

按照上面的取模公式

  • user_id為1295的會(huì)落在user5里面
  • user_id為8634的會(huì)落在user4里面
  • 。。。。。。。

「每次CURD根據(jù)上面查找表的策略進(jìn)行就行了」,這個(gè)問題不大,我們暫且先不多說。

已經(jīng)上線的運(yùn)行中的表怎么辦?

其實(shí)上面的方法大家應(yīng)該都知道怎么用,但是有個(gè)問題,已經(jīng)上線了的表怎么辦?那張表的數(shù)據(jù)在線上是一直被查找或者改變的。如何能夠進(jìn)行平滑的分表,并且讓用戶無感知呢?

方法1

直接上線,提前寫個(gè)腳本,腳本內(nèi)容是把舊表(user)的數(shù)據(jù)同步到user1表到user10表,一上線了趕緊執(zhí)行

這種方法明顯是行不通的,主要是存在以下問題

  • 如果執(zhí)行過程中腳本有問題怎么辦?代碼全部回滾?
  • 腳本把把舊表(user)的數(shù)據(jù)同步到user1表到user10表,這個(gè)腳本得執(zhí)行多久? 如果是1個(gè)小時(shí),那么這段時(shí)間線上和這張表相關(guān)的業(yè)務(wù)都是不正常的

這顯然是行不通的,對(duì)線上影響很大。

方法2

先寫個(gè)同步數(shù)據(jù)的腳本,腳本內(nèi)容是把舊表(user)的數(shù)據(jù)同步到user1表到user10表,腳本同步完了再上線。

這個(gè)方法看起來友好了一些,不過也存在一些問題。

  • 腳本同步完,立即上線,這兩件事之間是有一些時(shí)間差的,這個(gè)時(shí)間差中線上表可能有一些改動(dòng),這些改動(dòng)怎么辦?

「以上兩種方法看起來貌似都行不通,所以看來得來點(diǎn)不一樣的了。咱們直接看結(jié)論?!?/p>

步驟1 上線雙寫

首先咱們把雙寫上線了,什么意思呢?比如user_id=123,對(duì)于增加,刪除,修改操作來說,咱們既操作user表,也操作user_id=123對(duì)應(yīng)的user3表。

function modify($user_id){  //包含增加,刪除,修改操作
  modify_user();  //modify user表
  $table_name = $user_id % 10;
  modify_user($table_name) //modify對(duì)應(yīng)的分表
}

因?yàn)椴樵兊牟糠诌€是在user表中查詢的,所以上面的操作對(duì)線上用戶是無任何影響的。

步驟2 全量同步

寫一個(gè)全量同步user表到user1-user10的表,最好找個(gè)低峰期執(zhí)行腳本,以防萬一影響user表的查詢

這一步執(zhí)行之后,因?yàn)樵蹅冎吧暇€了雙寫(見步驟1),所以u(píng)ser表和user1-user10表之間的數(shù)據(jù)已經(jīng)是完全一致的了。

步驟3 查詢新表數(shù)據(jù)

將查詢的部分改到user1-user10

因?yàn)榍懊鎯蓚€(gè)步驟咱們已經(jīng)保證了user表和各個(gè)分表之間的數(shù)據(jù)完全一致性,所以直接把查詢的部分改掉是沒有任何問題的

如果按照以上步驟執(zhí)行,那么對(duì)線上的數(shù)據(jù)是沒有任何影響的,而且我們線上就是這么操作了,經(jīng)過了多次實(shí)踐確保不會(huì)出問題,放心使用即可。

總結(jié)

到此這篇關(guān)于mysql分表之后如何平滑上線的文章就介紹到這了,更多相關(guān)mysql分表平滑上線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql 如何實(shí)現(xiàn)多張無關(guān)聯(lián)表查詢數(shù)據(jù)并分頁(yè)

    Mysql 如何實(shí)現(xiàn)多張無關(guān)聯(lián)表查詢數(shù)據(jù)并分頁(yè)

    這篇文章主要介紹了Mysql 實(shí)現(xiàn)多張無關(guān)聯(lián)表查詢數(shù)據(jù)并分頁(yè)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談慢SQL優(yōu)化之索引的作用

    淺談慢SQL優(yōu)化之索引的作用

    本文針對(duì)?MySQL?數(shù)據(jù)庫(kù)的?InnoDB?存儲(chǔ)引擎,介紹其中索引的實(shí)現(xiàn)以及索引在慢?SQL?優(yōu)化中的作用,本文主要討論不同場(chǎng)景下索引生效與失效的原因,感興趣的小伙伴可以跟著小編一起來探討
    2023-05-05
  • MySQL數(shù)據(jù)庫(kù)配置優(yōu)化的方案

    MySQL數(shù)據(jù)庫(kù)配置優(yōu)化的方案

    我們總是希望MySQL能夠獲得更高的查詢性能,最好的辦法是弄清楚MySQL是如何優(yōu)化和執(zhí)行查詢的。本文講解MySQL在各個(gè)方面的優(yōu)化方向,方便后端開發(fā)人員在調(diào)優(yōu)和問題排查過程中找到切入點(diǎn)
    2023-02-02
  • 淺談sql連接查詢的區(qū)別 inner,left,right,full

    淺談sql連接查詢的區(qū)別 inner,left,right,full

    下面小編就為大家?guī)硪黄獪\談sql連接查詢的區(qū)別 inner,left,right,full。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • MySQL中show命令方法得到表列及整個(gè)庫(kù)的詳細(xì)信息(精品珍藏)

    MySQL中show命令方法得到表列及整個(gè)庫(kù)的詳細(xì)信息(精品珍藏)

    MySQL中show 句法得到表列及整個(gè)庫(kù)的詳細(xì)信息,方便查看數(shù)據(jù)庫(kù)的詳細(xì)信息。
    2010-11-11
  • MySQL大庫(kù)搭建主從的一種思路分享

    MySQL大庫(kù)搭建主從的一種思路分享

    這篇文章主要介紹了MySQL大庫(kù)搭建主從的一種思路分享,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-03-03
  • 最新評(píng)論