MySQL面試知識(shí)點(diǎn)追命連環(huán)問(三)鎖機(jī)制曾棕、日志備份及分表策略

上次我們討論了MySQL的事務(wù)索引扣猫,SQL優(yōu)化和處理器。

MySQL面試知識(shí)點(diǎn)追命連環(huán)問(二)事務(wù)翘地、索引及SQL優(yōu)化

這次我們繼續(xù)來追命連環(huán)問關(guān)于MySQL鎖機(jī)制申尤,日志備份和擴(kuò)展性等相關(guān)的內(nèi)容。

  • 鎖機(jī)制

  • 日志備份

  • 集群

  • 分庫(kù)分表

1. MySQL鎖機(jī)制

面試官:你知道MySQL的鎖機(jī)制嗎衙耕?

答:知道的昧穿。MySQL鎖按加鎖粒度可以分為行鎖表鎖和頁(yè)鎖。按鎖的使用方式可以分為共享鎖和排他鎖橙喘。按加鎖思想可以分為悲觀鎖和樂觀鎖时鸵。

image

1.行鎖與表鎖

行級(jí)鎖是MySQL中鎖定粒度最細(xì)的一種鎖,表示只針對(duì)當(dāng)前操作的行進(jìn)行加鎖厅瞎。行級(jí)鎖能大大減少數(shù)據(jù)庫(kù)操作的沖突饰潜。其加鎖粒度最小,但加鎖的開銷也最大和簸。有可能會(huì)出現(xiàn)死鎖的情況彭雾。

表級(jí)鎖是MySQL鎖中粒度最大的一種鎖,表示當(dāng)前的操作對(duì)整張表加鎖锁保,資源開銷比行鎖少薯酝,不會(huì)出現(xiàn)死鎖的情況半沽,但是發(fā)生鎖沖突的概率很大。被大部分的mysql引擎支持吴菠,MyISAM和InnoDB都支持表級(jí)鎖者填,但是InnoDB默認(rèn)的是行級(jí)鎖。頁(yè)鎖是介于行鎖和表鎖之間的一種鎖橄务。一次鎖定相鄰的一組記錄幔托。

在 MySQL 中穴亏,行級(jí)鎖并不是直接鎖記錄蜂挪,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種嗓化,如果一條sql 語(yǔ)句操作了主鍵索引棠涮,MySQL 就會(huì)鎖定這條主鍵索引;如果一條語(yǔ)句操作了非主鍵索引刺覆,MySQL會(huì)先鎖定該非主鍵索引严肪,再鎖定相關(guān)的主鍵索引。

InnoDB 行鎖是通過給索引項(xiàng)加鎖實(shí)現(xiàn)的谦屑,如果沒有索引驳糯,InnoDB 會(huì)通過隱藏的聚簇索引來對(duì)記錄加鎖。也就是說:如果不通過索引條件檢索數(shù)據(jù)氢橙,那么InnoDB將對(duì)表中所有數(shù)據(jù)加鎖酝枢,實(shí)際效果跟表鎖一樣。因?yàn)闆]有了索引悍手,找到某一條記錄就得掃描全表帘睦,要掃描全表,就得鎖定表坦康。

2.共享鎖和排他鎖

行鎖表鎖只是描述鎖的范圍竣付,而加鎖方式有共享鎖和排他鎖兩種。

數(shù)據(jù)庫(kù)的增刪改操作默認(rèn)都會(huì)加排他鎖滞欠,而查詢不會(huì)加任何鎖古胆。

共享鎖(s鎖 讀鎖):對(duì)某一資源加共享鎖,自身可以讀該資源筛璧,其他人也可以讀該資源(也可以再繼續(xù)加共享鎖逸绎,即 共享鎖可多個(gè)共存),但無法修改隧哮。要想修改就必須等所有共享鎖都釋放完之后桶良。
共享鎖就是允許多個(gè)線程同時(shí)獲取一個(gè)鎖,一個(gè)鎖可以同時(shí)被多個(gè)線程擁有沮翔。

排他鎖(x鎖 寫鎖):對(duì)某一資源加排他鎖陨帆,自身可以進(jìn)行增刪改查曲秉,其他人無法進(jìn)行任何操作。

數(shù)據(jù)庫(kù)規(guī)定同一資源上不能同時(shí)共存共享鎖和排他鎖疲牵。 排它鎖承二,也稱作獨(dú)占鎖,一個(gè)鎖在某一時(shí)刻只能被一個(gè)線程占有纲爸,其它線程必須等待鎖被釋放之后才可能獲取到鎖亥鸠。

3.樂觀鎖和悲觀鎖

悲觀鎖和樂觀鎖是兩種加鎖的思想。樂觀并發(fā)控制(樂觀鎖)和悲觀并發(fā)控制(悲觀鎖)是并發(fā)控制主要采用的技術(shù)手段识啦。

樂觀鎖在操作數(shù)據(jù)時(shí)非常樂觀负蚊,認(rèn)為別人不會(huì)同時(shí)修改數(shù)據(jù)。因此樂觀鎖不會(huì)上鎖颓哮,只是在執(zhí)行更新的時(shí)候判斷一下在此期間別人是否修改了數(shù)據(jù):如果別人修改了數(shù)據(jù)則放棄操作家妆,否則執(zhí)行操作。

樂觀鎖主要是基于數(shù)據(jù)版本機(jī)制來實(shí)現(xiàn)冕茅,實(shí)現(xiàn)方式有兩種:CAS和版本號(hào)機(jī)制伤极。MVCC也是樂觀鎖的一種實(shí)現(xiàn)方式。(注:與MVCC相對(duì)的姨伤,是基于鎖的并發(fā)控制哨坪,Lock-Based Concurrency Control。MVCC最大的好處是:讀不加鎖乍楚,讀寫不沖突当编。讀分為快照讀和當(dāng)前讀,快照讀基于數(shù)據(jù)的可見版本不加鎖炊豪。)

3.1 CAS算法(compare and swap)

如果內(nèi)存位置V的值等于預(yù)期的A值凌箕,則將該位置更新為新值B,否則不進(jìn)行任何操作词渤。許多CAS的操作是自旋的:如果操作不成功牵舱,會(huì)一直重試,直到操作成功為止缺虐。CAS是由CPU支持的原子操作芜壁,其原子性是在硬件層面進(jìn)行保證的。

需要3個(gè)操作數(shù):需要讀寫的內(nèi)存值(V),進(jìn)行比較的預(yù)期值(A)高氮,擬寫入的新值(B)慧妄。

缺點(diǎn):

1,ABA問題剪芍。解決:引入版本號(hào)機(jī)制
2塞淹,高并發(fā)下一直競(jìng)爭(zhēng)失敗。解決:引入退出機(jī)制罪裹,設(shè)置閾值饱普。
3运挫,功能受限,例如CAS只能保證單個(gè)變量(或者說單個(gè)內(nèi)存值)操作的原子性套耕。

3.2 版本號(hào)機(jī)制

版本號(hào)機(jī)制的基本思路是在數(shù)據(jù)中增加一個(gè)字段version谁帕,表示該數(shù)據(jù)的版本號(hào),每當(dāng)數(shù)據(jù)被修改冯袍,版本號(hào)加1匈挖。當(dāng)某個(gè)線程查詢數(shù)據(jù)時(shí),將該數(shù)據(jù)的版本號(hào)一起查出來康愤;當(dāng)該線程更新數(shù)據(jù)時(shí)儡循,判斷當(dāng)前版本號(hào)與之前讀取的版本號(hào)是否一致,如果一致才進(jìn)行操作翘瓮。

實(shí)際上可以根據(jù)實(shí)際情況選用其他能夠標(biāo)記數(shù)據(jù)版本的字段贮折,如時(shí)間戳等裤翩。

悲觀鎖

悲觀鎖在操作數(shù)據(jù)時(shí)比較悲觀资盅,認(rèn)為別人會(huì)同時(shí)修改數(shù)據(jù)。因此操作數(shù)據(jù)時(shí)直接把數(shù)據(jù)鎖住踊赠,直到操作完成后才會(huì)釋放鎖呵扛;上鎖期間其他人不能修改數(shù)據(jù)。

悲觀鎖的實(shí)現(xiàn)方式是加鎖筐带,加鎖既可以是對(duì)代碼塊加鎖(如Java的synchronized關(guān)鍵字)今穿,也可以是對(duì)數(shù)據(jù)加鎖(如MySQL中的排它鎖)。這里主要講的是MySQL中的悲觀鎖伦籍。悲觀鎖通過排他鎖來實(shí)現(xiàn)的蓝晒。

悲觀鎖可以阻止一個(gè)事務(wù)以影響其他用戶的方式來修改數(shù)據(jù)。如果一個(gè)事務(wù)執(zhí)行的操作對(duì)某行數(shù)據(jù)應(yīng)用了鎖帖鸦,那只有當(dāng)這個(gè)事務(wù)把鎖釋放芝薇,其他事務(wù)才能夠執(zhí)行與該鎖沖突的操作。悲觀并發(fā)控制主要用于數(shù)據(jù)爭(zhēng)用激烈的環(huán)境作儿,以及發(fā)生并發(fā)沖突時(shí)使用鎖保護(hù)數(shù)據(jù)的成本要低于回滾事務(wù)的成本的環(huán)境中洛二。

悲觀鎖實(shí)際上是采取了“先取鎖在訪問”的策略,為數(shù)據(jù)的處理安全提供了保證攻锰,但是在效率方面晾嘶,由于額外的加鎖機(jī)制產(chǎn)生了額外的開銷,并且增加了死鎖的機(jī)會(huì)娶吞。并且降低了并發(fā)性

悲觀鎖和樂觀鎖的比較

1.與悲觀鎖相比垒迂,樂觀鎖適用的場(chǎng)景受到了更多的限制,無論是CAS還是版本號(hào)機(jī)制妒蛇。

2.如果悲觀鎖和樂觀鎖都可以使用机断,那么選擇就要考慮競(jìng)爭(zhēng)的激烈程度策添。競(jìng)爭(zhēng)不激烈時(shí)樂觀鎖更好,反之悲觀鎖更好毫缆。

面試官:那樂觀鎖加鎖嗎唯竹?

答:
(1)樂觀鎖本身是不加鎖的,只是在更新時(shí)判斷一下數(shù)據(jù)是否被其他線程更新了苦丁;
(2)有時(shí)樂觀鎖可能與加鎖操作合作浸颓,但不能改變“樂觀鎖本身不加鎖”這一事實(shí)。

面試官:那你知道死鎖嗎旺拉?是怎么產(chǎn)生的又怎么樣解決呢产上?

4. 死鎖

MySQL中的死鎖一般是事務(wù)相互等待對(duì)方資源,最后形成環(huán)路造成的蛾狗。若無外力作用,它們都將無法推進(jìn)下去晋涣。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。

死鎖的產(chǎn)生主要有以下幾種情況:不同表相同記錄行鎖沖突沉桌,相同表記錄行鎖沖突谢鹊,不同索引鎖沖突,gap鎖沖突留凭。

死鎖的發(fā)生與否佃扼,并不在于事務(wù)中有多少條SQL語(yǔ)句,死鎖的關(guān)鍵在于:兩個(gè)(或以上)的Session加鎖的順序不一致蔼夜。

所以當(dāng)出現(xiàn)死鎖時(shí)要分析MySQL每條SQL語(yǔ)句的加鎖規(guī)則兼耀,分析出每條語(yǔ)句的加鎖順序,然后檢查多個(gè)并發(fā)SQL間是否存在以相反的順序加鎖的情況求冷,就可以分析出各種潛在的死鎖情況瘤运,也可以分析出線上死鎖發(fā)生的原因。同時(shí)可以通過應(yīng)用業(yè)務(wù)日志定位到問題代碼匠题,找到相應(yīng)的事務(wù)對(duì)應(yīng)的sql拯坟。

死鎖發(fā)生以后,只有部分或完全回滾其中一個(gè)事務(wù)梧躺,才能打破死鎖似谁,InnoDB目前處理死鎖的方法是,將持有最少行級(jí)排他鎖的事務(wù)進(jìn)行回滾掠哥。所以事務(wù)型應(yīng)用程序在設(shè)計(jì)時(shí)必須考慮如何處理死鎖巩踏,多數(shù)情況下只需要重新執(zhí)行因死鎖回滾的事務(wù)即可。

避免死鎖的方法:

1)以固定的順序訪問表和行续搀。

2)大事務(wù)拆小塞琼。大事務(wù)更傾向于死鎖,如果業(yè)務(wù)允許禁舷,將大事務(wù)拆小彪杉。

3)在同一個(gè)事務(wù)中毅往,盡可能做到一次鎖定所需要的所有資源,減少死鎖概率派近。

4)降低隔離級(jí)別攀唯。如果業(yè)務(wù)允許,將隔離級(jí)別調(diào)低也是較好的選擇渴丸,比如將隔離級(jí)別從RR調(diào)整為RC侯嘀,可以避免掉很多因?yàn)間ap鎖造成的死鎖。

5)為表添加合理的索引谱轨〗溽#可以看到如果不走索引將會(huì)為表的每一行記錄添加上鎖,死鎖的概率大大增大土童。

2.MySQL日志與備份

面試官:你知道MySQL有哪些日志嗎诗茎?

答:MySQL日志有很多種,主要有二進(jìn)制日志(bin log)献汗,錯(cuò)誤日志敢订,慢查詢?nèi)罩荆ㄓ貌樵內(nèi)罩竞褪聞?wù)日志雀瓢。二進(jìn)制日志是MySQL的上層日志枢析,先于存儲(chǔ)引擎的事務(wù)日志被寫入。MySQL的日志主要用于異常監(jiān)控刃麸、性能優(yōu)化、數(shù)據(jù)恢復(fù)和主從同步等功能司浪。

面試官:那你說一下事務(wù)日志吧泊业。

我:Innodb事務(wù)日志包括redo log和undo log。redo log是重做日志啊易,提供前滾操作吁伺,undo log是回滾日志,提供回滾操作租谈。它們都算是用來恢復(fù)的日志篮奄。

InnoDB存儲(chǔ)引擎是以頁(yè)為單位來管理存儲(chǔ)空間的,我們進(jìn)行的增刪改查操作都是將頁(yè)的數(shù)據(jù)加載到內(nèi)存中割去,然后進(jìn)行操作窟却,再將數(shù)據(jù)刷回到硬盤上。

1. Redo Log

redo log包括兩部分:一是內(nèi)存中的日志緩沖(redo log buffer)呻逆,該部分日志是易失性的夸赫;二是磁盤上的重做日志文件(redo log file),該部分日志是持久的咖城。

為了確保每次日志都能寫入到事務(wù)日志文件中茬腿,在每次將log buffer中的日志寫入日志文件的過程中都會(huì)調(diào)用一次操作系統(tǒng)的fsync操作(即fsync()系統(tǒng)調(diào)用)

image

在啟動(dòng)innodb的時(shí)候呼奢,不管上次是正常關(guān)閉還是異常關(guān)閉,總是會(huì)進(jìn)行恢復(fù)操作切平。因?yàn)閞edo log記錄的是數(shù)據(jù)頁(yè)的物理變化握础,因此恢復(fù)的時(shí)候速度比邏輯日志(如二進(jìn)制日志)要快很多。而且悴品,Innodb自身也做了一定程度的優(yōu)化弓候,讓恢復(fù)速度變得更快。

事務(wù)日志具有冪等性他匪,所以多次操作得到同一結(jié)果的行為在日志中只記錄一次菇存。而二進(jìn)制日志不具有冪等性,多次操作會(huì)全部記錄下來邦蜜,在恢復(fù)的時(shí)候會(huì)多次執(zhí)行二進(jìn)制日志中的記錄依鸥,速度就慢得多。

2. Undo Log

undo log有兩個(gè)作用:提供回滾和多個(gè)行版本控制(MVCC)悼沈。

在數(shù)據(jù)修改的時(shí)候贱迟,不僅記錄了redo,還記錄了相對(duì)應(yīng)的undo絮供,如果因?yàn)槟承┰驅(qū)е率聞?wù)失敗或回滾了衣吠,可以借助該undo進(jìn)行回滾。undo log和redo log記錄物理日志不一樣壤靶,它是邏輯日志缚俏。可以認(rèn)為當(dāng)delete一條記錄時(shí)贮乳,undo log中會(huì)記錄一條對(duì)應(yīng)的insert記錄忧换,反之亦然,當(dāng)update一條記錄時(shí)向拆,它記錄一條對(duì)應(yīng)相反的update記錄亚茬。

當(dāng)執(zhí)行rollback時(shí),就可以從undo log中的邏輯記錄讀取到相應(yīng)的內(nèi)容并進(jìn)行回滾浓恳。有時(shí)候應(yīng)用到版本控制的時(shí)候刹缝,也是通過undo log來實(shí)現(xiàn)的:當(dāng)讀取的某一行被其他事務(wù)鎖定時(shí),它可以從undo log中分析出該行記錄以前的數(shù)據(jù)是什么颈将,從而提供該行版本信息梢夯,讓用戶實(shí)現(xiàn)非鎖定一致性讀取。

undo log是采用段(segment)的方式來記錄的吆鹤,每個(gè)undo操作在記錄的時(shí)候占用一個(gè)undo log segment厨疙。另外,undo log也會(huì)產(chǎn)生redo log,因?yàn)閡ndo log也要實(shí)現(xiàn)持久性保護(hù)沾凄。

事務(wù)涉及到數(shù)據(jù)修改時(shí)梗醇,默認(rèn)情況下會(huì)在commit的時(shí)候調(diào)用fsync()將日志刷到磁盤,保證事務(wù)的持久性撒蟀。但是一次刷一個(gè)事務(wù)的日志性能較低叙谨,特別是事務(wù)集中在某一時(shí)刻時(shí)事務(wù)量非常大的時(shí)候。innodb提供了group commit功能保屯,可以將多個(gè)事務(wù)的事務(wù)日志通過一次fsync()刷到磁盤中手负。

3.MySQL集群

面試官:你知道MySQL集群?jiǎn)幔?/strong>

答:MySQL 群集分為三種節(jié)點(diǎn):管理節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)和SQL節(jié)點(diǎn)姑尺。

管理節(jié)點(diǎn):主要用于管理各個(gè)節(jié)點(diǎn)竟终,能夠通過命令對(duì)某個(gè)節(jié)點(diǎn)進(jìn)行重啟、關(guān)閉切蟋、啟動(dòng)等操作统捶。也能夠監(jiān)視全部節(jié)點(diǎn)的工作狀態(tài)。

數(shù)據(jù)節(jié)點(diǎn):主要是對(duì)數(shù)據(jù)的存儲(chǔ)柄粹,不提供其他的服務(wù)喘鸟。

SQL節(jié)點(diǎn):主要是對(duì)外提供SQL功能,類似一臺(tái)普通的 MySQL Server驻右。

image

而SQL節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)可以是同一臺(tái)機(jī)器什黑,也就是說這臺(tái)機(jī)器即是SQL節(jié)點(diǎn)也是數(shù)據(jù)節(jié)點(diǎn)。它們只是邏輯關(guān)系上的劃分堪夭,實(shí)際部署時(shí)愕把,甚至所有的階段都可以位于同一臺(tái)物理機(jī)器上,只是配置較復(fù)雜些茵瘾。

我們?cè)诳紤]MySQL數(shù)據(jù)庫(kù)的高可用的架構(gòu)時(shí)礼华,主要要考慮如下幾方面:

如果數(shù)據(jù)庫(kù)發(fā)生了宕機(jī)或者意外中斷等故障,能盡快恢復(fù)數(shù)據(jù)庫(kù)的可用性拗秘,盡可能的減少停機(jī)時(shí)間,保證業(yè)務(wù)不會(huì)因?yàn)閿?shù)據(jù)庫(kù)的故障而中斷祈惶。用作備份雕旨、只讀副本等功能的非主節(jié)點(diǎn)的數(shù)據(jù)應(yīng)該和主節(jié)點(diǎn)的數(shù)據(jù)實(shí)時(shí)或者最終保持一致。當(dāng)業(yè)務(wù)發(fā)生數(shù)據(jù)庫(kù)切換時(shí)捧请,切換前后的數(shù)據(jù)庫(kù)內(nèi)容應(yīng)當(dāng)一致凡涩,不會(huì)因?yàn)閿?shù)據(jù)缺失或者數(shù)據(jù)不一致而影響業(yè)務(wù)。所以需要MySQL集群來保證數(shù)據(jù)庫(kù)的高可用性疹蛉。

面試官:MySQL集群有什么優(yōu)缺點(diǎn)呢活箕?

優(yōu)點(diǎn):

  • 99.999 %的高可用性

  • 快速的自動(dòng)失效切換

  • 靈活的分布式體系結(jié)構(gòu),沒有單點(diǎn)故障

  • 高吞吐量和低延遲

  • 可擴(kuò)展性強(qiáng)可款,支持在線擴(kuò)容

缺點(diǎn):

  • 存在很多限制育韩,比如:不支持外鍵克蚂,數(shù)據(jù)行不能超過8K(不包括BLOB和text中的數(shù)據(jù))

  • 部署、管理筋讨、配置很復(fù)雜

  • 占用磁盤空間大埃叭,內(nèi)存大

  • 備份和恢復(fù)不方便

  • 重啟的時(shí)候,數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)load到內(nèi)存需要很長(zhǎng)時(shí)間

4.MySQL可拓展性(分庫(kù)分表)

面試官:如果一張表的數(shù)量非常大怎么辦悉罕?

答:隨著表中的數(shù)據(jù)量也會(huì)越來越大赤屋,相應(yīng)地,數(shù)據(jù)操作壁袄,增刪改查的開銷也會(huì)越來越大类早。這時(shí)可進(jìn)行分表。分表的話有水平分表和垂直分表嗜逻。

垂直切分:依照不同的表(或者Schema)來切分到不同的數(shù)據(jù)庫(kù)(主機(jī))之上涩僻,這樣的切分稱之為數(shù)據(jù)的垂直(縱向)切分。垂直拆分規(guī)則明確变泄,拆分后業(yè)務(wù)清晰令哟;系統(tǒng)之間進(jìn)行整合或擴(kuò)展變的容易;但也會(huì)導(dǎo)致部分業(yè)務(wù)表無法關(guān)聯(lián)(Join)妨蛹,只能通過接口方式解決屏富,提高了系統(tǒng)的復(fù)雜度;但隨著數(shù)據(jù)量的增多蛙卤,極有可能還要增加水平切分狠半;

水平切分:依據(jù)表中的數(shù)據(jù)的邏輯關(guān)系,將同一個(gè)表中的數(shù)據(jù)依照某種條件拆分到多臺(tái)數(shù)據(jù)庫(kù)(主機(jī)颤难,當(dāng)然也可能是同一個(gè)數(shù)據(jù)庫(kù))上面神年。在每個(gè)表中包含一部分?jǐn)?shù)據(jù),所有表加起來就是全量的數(shù)據(jù)行嗤。這樣的切分稱之為數(shù)據(jù)的水平(橫向)切分已日。

水平切分的優(yōu)點(diǎn)也很明顯幅骄,比如某個(gè)表高峰時(shí)段同時(shí)有100萬次請(qǐng)求口柳,如果是單庫(kù)翔始,數(shù)據(jù)庫(kù)就會(huì)承受100萬次的請(qǐng)求壓力随抠,拆分成100個(gè)表分別放入10個(gè)庫(kù)中搞旭,每個(gè)表進(jìn)行1萬次請(qǐng)求丘逸,則每個(gè)數(shù)據(jù)庫(kù)會(huì)承受10萬次的請(qǐng)求壓力绊寻,這樣壓力就減少了很多唱较,并且是成倍減少的哥纫。

image

面試官:水平分表有哪幾種分法呢霉旗,優(yōu)缺點(diǎn)是什么?

水平分庫(kù)分表的切分規(guī)則主要包括如下幾種:

  1. 按號(hào)段分
    user_id為區(qū)分,1~1000的對(duì)應(yīng)DB1厌秒,1001~2000的對(duì)應(yīng)DB2读拆,以此類推;
    優(yōu)點(diǎn):可部分遷移
    缺點(diǎn):數(shù)據(jù)分布不均

  2. hash取模分:
    對(duì)user_id進(jìn)行hash简僧,余數(shù)相同的id會(huì)分到同一張表建椰。
    優(yōu)點(diǎn):數(shù)據(jù)分布均勻
    缺點(diǎn):數(shù)據(jù)遷移的時(shí)候麻煩,不能按照機(jī)器性能分?jǐn)倲?shù)據(jù)

  3. 在認(rèn)證庫(kù)中保存數(shù)據(jù)庫(kù)配置
    建立一個(gè)DB岛马,這個(gè)DB單獨(dú)保存user_id到DB的映射關(guān)系棉姐,每次訪問數(shù)據(jù)庫(kù)的時(shí)候都要先查詢一次這個(gè)數(shù)據(jù)庫(kù),以得到具體的DB信息啦逆,然后才能進(jìn)行我們需要的查詢操作伞矩。
    優(yōu)點(diǎn):靈活性強(qiáng),一對(duì)一關(guān)系
    缺點(diǎn):每次查詢之前都要多一次查詢夏志,性能大打折扣

  4. 其他方式
    1)按照地理區(qū)域:比如按照華東乃坤,華南,華北這樣來區(qū)分業(yè)務(wù)沟蔑。
    2)按照時(shí)間切分湿诊,就是將6個(gè)月前,甚至一年前的數(shù)據(jù)切出去放到另外的一張表瘦材,因?yàn)殡S著時(shí)間流逝厅须,這些表的數(shù)據(jù)被查詢的概率變小食棕,所以沒必要和“熱數(shù)據(jù)”放在一起朗和,這個(gè)也是“冷熱數(shù)據(jù)分離”。

以上就是通常的開發(fā)中我們選擇的方式簿晓,有些復(fù)雜的項(xiàng)目中可能會(huì)混合使用這些方式眶拉。

水平拆分的優(yōu)點(diǎn):高并發(fā)的性能瓶頸;應(yīng)用端改造較少憔儿;提高了系統(tǒng)的穩(wěn)定性跟負(fù)載能力忆植。

數(shù)據(jù)庫(kù)中的數(shù)據(jù)在經(jīng)過垂直和(或)水平切分被存放在不同的數(shù)據(jù)庫(kù)(表)主機(jī)之后,應(yīng)用系統(tǒng)面臨的最大問題就是怎樣來讓這些數(shù)據(jù)源得到較好的整合谒臼,當(dāng)然也包括切分的一個(gè)唯一性保障的問題唱逢。

一個(gè)是要保證ID的全局唯一性,二是查詢數(shù)據(jù)結(jié)果集合并問題屋休,這里包括跨節(jié)點(diǎn)Join的問題,跨節(jié)點(diǎn)合并排序分頁(yè)問題以及分布式事務(wù)問題备韧。

ID的全局唯一性可以通過設(shè)置表的不同開始ID和相同步長(zhǎng)來解決劫樟,跨節(jié)點(diǎn)join問題可以通過應(yīng)用程序來處理,而跨節(jié)點(diǎn)排序分頁(yè)可以從多個(gè)數(shù)據(jù)源并行執(zhí)行。

好啦叠艳,今天的追命連環(huán)問就到這里了奶陈,下次繼續(xù),如對(duì)文章有疑惑或補(bǔ)充的地方歡迎留言交流(●'?'●)附较。原創(chuàng)不易吃粒,如果對(duì)你有幫助的話歡迎點(diǎn)贊!

相關(guān)推薦閱讀

你知道一次完整的HTTP請(qǐng)求過程嗎

Redis常見面試題連環(huán)問拒课,你能回答到第幾問徐勃?****(上)

大廠高頻面試題:****高并發(fā)下接口冪等性的解決方案?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末早像,一起剝皮案震驚了整個(gè)濱河市僻肖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卢鹦,老刑警劉巖臀脏,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冀自,居然都是意外死亡揉稚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門熬粗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀玖,“玉大人,你說我怎么就攤上這事荐糜∠锪” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵暴氏,是天一觀的道長(zhǎng)延塑。 經(jīng)常有香客問我,道長(zhǎng)答渔,這世上最難降的妖魔是什么关带? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮沼撕,結(jié)果婚禮上宋雏,老公的妹妹穿的比我還像新娘。我一直安慰自己务豺,他們只是感情好磨总,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笼沥,像睡著了一般蚪燕。 火紅的嫁衣襯著肌膚如雪娶牌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天馆纳,我揣著相機(jī)與錄音诗良,去河邊找鬼。 笑死鲁驶,一個(gè)胖子當(dāng)著我的面吹牛鉴裹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钥弯,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼径荔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了寿羞?” 一聲冷哼從身側(cè)響起猖凛,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绪穆,沒想到半個(gè)月后辨泳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玖院,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年菠红,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片难菌。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡试溯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郊酒,到底是詐尸還是另有隱情遇绞,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布燎窘,位于F島的核電站摹闽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏褐健。R本人自食惡果不足惜付鹿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚜迅。 院中可真熱鬧舵匾,春花似錦、人聲如沸谁不。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刹帕。三九已至烛缔,卻和暖如春馏段,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背践瓷。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亡蓉,地道東北人晕翠。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像砍濒,于是被迫代替她去往敵國(guó)和親淋肾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這篇文章主要涉及到MySQL的知識(shí)點(diǎn): 索引(包括分類及優(yōu)化方式爸邢,失效條件樊卓,底層結(jié)構(gòu)) sql語(yǔ)法(join,un...
    一根薯?xiàng)l閱讀 2,712評(píng)論 0 8
  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫(kù)的原理杠河,叫他看這篇文章(轉(zhuǎn))" date...
    藍(lán)墜星閱讀 790評(píng)論 0 3
  • 0. MySQL邏輯架構(gòu) 最上層是一些客戶端和連接服務(wù)碌尔,包含本地sock通信和大多數(shù)基于客戶端/服務(wù)端工具實(shí)現(xiàn)的類...
    beg4閱讀 1,032評(píng)論 0 1
  • 具體細(xì)節(jié) 請(qǐng)去掘金購(gòu)買《MySQL 是怎樣運(yùn)行的:從根兒上理解 MySQL》 通用鏈表結(jié)構(gòu)(頁(yè)通過這些pageNu...
    簡(jiǎn)書徐小耳閱讀 1,143評(píng)論 0 0
  • 最近碰到幾個(gè)業(yè)務(wù)場(chǎng)景,會(huì)遇到并發(fā)的問題券敌。在單實(shí)例情況下唾戚,我們會(huì)通過java.util.concurrent包...
    菜鳥小玄閱讀 2,255評(píng)論 0 5