題目:高并發(fā)情況下,數(shù)據(jù)庫該如何設(shè)計(jì)?
JAVA高級(jí)面試題:為什么要分庫分表( 設(shè)計(jì)高并發(fā)系統(tǒng)的時(shí)候 , 數(shù)據(jù)庫層面該如何設(shè)計(jì) ) ? 用過哪些分庫分表中間件 ? 不同的分庫分表中間件都有什么優(yōu)點(diǎn)和缺點(diǎn)? 你們具體是如何對(duì)數(shù)據(jù)庫 如何進(jìn)行垂直拆分或水平拆分的?
題目來源:Java高級(jí)架構(gòu)面試知識(shí)點(diǎn)整理--MySQL分庫分表問題(附解析,如下圖)
Java高級(jí)面試:MySQL分庫分表問題
Java高級(jí)架構(gòu)面試知識(shí)點(diǎn)整理:包含消息隊(duì)列、redis緩存、MySQL分庫分表、讀寫分離、設(shè)計(jì)高并發(fā)系統(tǒng)、分布式系統(tǒng)、高可用架構(gòu)、SpringCloud微服務(wù)架構(gòu) 等8大類近200頁的內(nèi)容,從面試官心理分享 到 面試題剖析,一步一步扣題深入,通俗易懂,是不可多得的干貨!
如需原件學(xué)習(xí),可私信@追逐仰望星空口令【高級(jí)】分享!
面試官心理分析
其實(shí)這塊肯定是扯到高并發(fā)了,因?yàn)?strong>分庫分表一定是為了支撐高并發(fā)、數(shù)據(jù)量大兩個(gè)問題的。而且現(xiàn)在說實(shí)話,尤其是互聯(lián)網(wǎng)類的公司面試,基本上都會(huì)來這么一下,分庫分表如此普遍的技術(shù)問題,不問實(shí)在是不行,而如果你不知道那也實(shí)在是說不過去!
面試題剖析
為什么要分庫分表?(設(shè)計(jì)高并發(fā)系統(tǒng)的時(shí)候,數(shù)據(jù)庫層面該如何設(shè)計(jì)?)
說白了,分庫分表是兩回事兒,大家可別搞混了,可能是光分庫不分表,也可能是光分表不分庫,都有可能。我先給大家拋出來一個(gè)場景:
假如我們現(xiàn)在是一個(gè)小創(chuàng)業(yè)公司(或者是一個(gè)BAT公司剛興起的一個(gè)新部門),現(xiàn)在注冊(cè)用戶就20萬,每天活躍用戶就1萬,每天單表數(shù)據(jù)量就1000,然后高峰期每秒鐘并發(fā)請(qǐng)求最多就10。天,就這種系統(tǒng),隨便找一個(gè)有幾年工作經(jīng)驗(yàn)的,然后帶幾個(gè)剛培訓(xùn)出來的,隨便干什么都可以。
結(jié)果沒想到我們運(yùn)氣居然這么好,碰上個(gè)CEO帶著我們走上了康莊大道,業(yè)務(wù)發(fā)展迅猛,過了幾個(gè)月,注冊(cè)用戶數(shù)達(dá)到了2000萬!每天活躍用戶數(shù)100萬!每天單表數(shù)據(jù)量10萬條!高峰期每秒最大請(qǐng)求達(dá)到1000!同時(shí)公司還順帶著融資了兩輪,進(jìn)賬了幾個(gè)億人民幣啊!公司估值達(dá)到了驚人的幾億美金!這是小獨(dú)角獸的節(jié)奏!
好吧,沒事,現(xiàn)在大家感覺壓力已經(jīng)有點(diǎn)大了,為啥呢?因?yàn)槊刻於?0萬條數(shù)據(jù),一個(gè)月就多300萬條數(shù)據(jù),現(xiàn)在咱們單表已經(jīng)幾百萬數(shù)據(jù)了,馬上就破千萬了。但是勉強(qiáng)還能撐著。高峰期請(qǐng)求現(xiàn)在是1000,咱們線上部署了幾臺(tái)機(jī)器,負(fù)載均衡搞了一下,數(shù)據(jù)庫撐1000QPS也還湊合。但是大家現(xiàn)在開始感覺有點(diǎn)擔(dān)心了,接下來咋整呢..... .
在接下來幾個(gè)月,我的天,CEO 太牛逼了,公司用戶數(shù)已經(jīng)達(dá)到1億,公司繼續(xù)融資幾十億人民幣啊!公司估值達(dá)到了驚人的幾十億美金,成為了國內(nèi)今年最牛逼的明星創(chuàng)業(yè)公司!天,我們太幸運(yùn)了。
但是我們同時(shí)也是不幸的,因?yàn)榇藭r(shí)每天活躍用戶數(shù)上千萬,每天單表新增數(shù)據(jù)多達(dá) 50萬,目前一個(gè)表總數(shù)據(jù)量都已經(jīng)達(dá)到了兩三千萬了!扛不住啊!數(shù)據(jù)庫磁盤容量不斷消耗掉!高峰期并發(fā)達(dá)到驚人的
5000~8000!別開玩笑了,哥。我跟你保證,你的系統(tǒng)支撐不到現(xiàn)在,已經(jīng)掛掉了!
好吧,所以你看到這里差不多就理解分庫分表是怎么回事兒了,實(shí)際上這是跟著你的公司業(yè)務(wù)發(fā)展走的,你公司業(yè)務(wù)發(fā)展越好,用戶就越多,數(shù)據(jù)量越大,請(qǐng)求量越大,那你單個(gè)數(shù)據(jù)庫一定扛不住。
分表
比如你單表都幾千萬數(shù)據(jù)了,你確定你能扛住么?絕對(duì)不行,單表數(shù)據(jù)量太大,會(huì)極大影響你的 sql 執(zhí)行的性能,到了后面你的 sql可能就跑得很慢了。一般來說,就以我的經(jīng)驗(yàn)來看,單表到幾百萬的時(shí)候,性能就會(huì)相對(duì)差一些了,你就得分表了。
分表是啥意思?就是把一個(gè)表的數(shù)據(jù)放到多個(gè)表中,然后查詢的時(shí)候再查一個(gè)表。比如按照用戶id來分表,將一個(gè)用戶的數(shù)據(jù)就放在一個(gè)表中。然后操作的時(shí)候你對(duì)一個(gè)用戶就操作那個(gè)表就好了。這樣可以控制每個(gè)表的數(shù)據(jù)量在可控的范圍內(nèi),比如每個(gè)表就固定在 200萬以內(nèi)。
分庫
分庫是啥意思?就是你一個(gè)庫一般我們經(jīng)驗(yàn)而言,最多支撐到并發(fā)2000,一定要擴(kuò)容了,而且一個(gè)健康的單庫并發(fā)值你最好保持在每秒1000 左右,不要太大。那么你可以將一個(gè)庫的數(shù)據(jù)拆分到多個(gè)庫中,訪問的時(shí)候就訪問一個(gè)庫好了。
這就是所謂的分庫分表,為啥要分庫分表?你明白了吧。
你們具體是如何對(duì)數(shù)據(jù)庫如何進(jìn)行垂直拆分或水平拆分的?
水平拆分的意思,就是把一個(gè)表的數(shù)據(jù)給弄到多個(gè)庫的多個(gè)表里去,但是每個(gè)庫的表結(jié)構(gòu)都一樣,只不過每個(gè)庫表放的數(shù)據(jù)是不同的,所有庫表的數(shù)據(jù)加起來就是全部數(shù)據(jù)。水平拆分的意義,就是將數(shù)據(jù)均勻放在更多的庫里,然后用多個(gè)庫來扛更高的并發(fā),還有就是用多個(gè)庫的存儲(chǔ)容量來進(jìn)行擴(kuò)容。
垂直拆分的意思,就是把一個(gè)有很多字段的表給拆分成多個(gè)表,或者是多個(gè)庫上去。每個(gè)庫表的結(jié)構(gòu)都不一樣,每個(gè)庫表都包含部分字段。一般來說,會(huì)將較少的訪問頻率很高的字段放到一個(gè)表里去,然后將較多的訪問頻率很低的字段放到另外一個(gè)表里去。因?yàn)閿?shù)據(jù)庫是有緩存的,你訪問頻率高的行字段越少,就可以在緩存里緩存更多的行,性能就越好。這個(gè)一般在表層面上做得較多一些。
還有表層面的拆分,就是分表,將一個(gè)表變成N個(gè)表,就是讓每個(gè)表的數(shù)據(jù)量控制在一定范圍內(nèi),保證SQL 的性能。否則單表數(shù)據(jù)量越大,SQL性能就越差。一般是200萬行左右,不要太多,但是也得看具體你怎么操作,也可能是500萬,或者是100萬。你的SQL越復(fù)雜,就最好讓單表行數(shù)越少。
涉及高并發(fā)系統(tǒng),我該怎么辦?
如果不想只是單純地做個(gè)底層CRUD的搬磚程序員,那么對(duì)于高并發(fā)系統(tǒng)設(shè)計(jì)這一類的問題,你必須得掌握!不用慌,小編整理了46問,貫穿整個(gè)高并發(fā)系統(tǒng)設(shè)計(jì)的問題,涉及:基礎(chǔ)、數(shù)據(jù)庫、緩存、消息隊(duì)列、分布式、維護(hù)、實(shí)戰(zhàn)操練等7個(gè)部分的內(nèi)容(并將每一問的答案解析整理完整)。
- 為什么要學(xué)習(xí)高并發(fā)系統(tǒng)設(shè)計(jì)?
- 高并發(fā)系統(tǒng):它的通用設(shè)計(jì)方法是什么
- 架構(gòu)分層:我們?yōu)槭裁匆欢ㄒ@么做
- 系統(tǒng)設(shè)計(jì)目標(biāo)(一):如何提升系統(tǒng)性能
- 系統(tǒng)設(shè)計(jì)目標(biāo)(二):系統(tǒng)怎樣做到高可用
- 系統(tǒng)設(shè)計(jì)目標(biāo)(三):如何讓系統(tǒng)易于擴(kuò)展
- 面試現(xiàn)場第一期:當(dāng)問到組件實(shí)現(xiàn)原理時(shí),面試官是在刁難你嗎?
- 池化技術(shù):如何減少頻繁創(chuàng)建數(shù)據(jù)庫連接的性能損耗?
- 數(shù)據(jù)庫優(yōu)化方案(一):查詢請(qǐng)求增加時(shí),如何做主從分離
- 數(shù)據(jù)庫優(yōu)化方案(二):寫入數(shù)據(jù)量增加時(shí),如何實(shí)現(xiàn)分庫分表
- 發(fā)號(hào)器:如何保證分庫分表后ID的全局唯─性?
- NoSQL:在高并發(fā)場景下,數(shù)據(jù)庫和 NoSQL 如何做到互補(bǔ)?
- 緩存:數(shù)據(jù)庫成為瓶頸后,動(dòng)態(tài)數(shù)據(jù)的查詢要如何加速?
- 緩存的使用姿勢(shì)(一):如何選擇緩存的讀寫策略?
- 緩存的使用姿勢(shì)(二):緩存如何做到高可用?
- 緩存的使用姿勢(shì)(三):緩存穿透了怎么辦?
- CDN:靜態(tài)資源如何加速?
- 數(shù)據(jù)的遷移應(yīng)該如何做?
- 消息隊(duì)列:秒殺時(shí)如何處理每秒上萬次的下單請(qǐng)求?
- 消息投遞:如何保證消息僅僅被消費(fèi)一次?
- 消息隊(duì)列:如何降低消息隊(duì)列系統(tǒng)中消息的延遲?
- 面試現(xiàn)場第二期:當(dāng)問到項(xiàng)目經(jīng)驗(yàn)時(shí),面試官究竟想要了解什么
- 從“心”出發(fā),我還有無數(shù)個(gè)可能
- 高并發(fā)系統(tǒng)設(shè)計(jì)期中測試題目解析
- 系統(tǒng)架構(gòu):每秒1萬次請(qǐng)求的系統(tǒng)要做服務(wù)化拆分嗎?
- 微服務(wù)架構(gòu):微服務(wù)化后系統(tǒng)架構(gòu)要如何改造?
- RPC框架:10萬 Q P S 下如何實(shí)現(xiàn)毫秒級(jí)的服務(wù)調(diào)用?
- 注冊(cè)中心:分布式系統(tǒng)如何尋址?
- 分布式Trace :橫跨幾十個(gè)分布式組件的慢請(qǐng)求要如何排查?
- 負(fù)載均衡:怎樣提升系統(tǒng)的橫向擴(kuò)展能力?
- A P I 網(wǎng)關(guān):系統(tǒng)的門面要如何做呢?
- 多機(jī)房部署:跨地域的分布式系統(tǒng)如何做?
- Service Mesh:如何屏蔽服務(wù)化系統(tǒng)的服務(wù)治理細(xì)節(jié)?
- 給系統(tǒng)加上眼睛:服務(wù)端監(jiān)控要怎么做?
- 應(yīng)用性能管理:用戶的使用體驗(yàn)應(yīng)該如何監(jiān)控?
- 壓力測試:怎樣設(shè)計(jì)全鏈路壓力測試平臺(tái)?
- 配置管理:成千上萬的配置項(xiàng)要如何管理?
- 降級(jí)熔斷:如何屏蔽非核心系統(tǒng)故障的影響?
- 流量控制:高并發(fā)系統(tǒng)中我們?nèi)绾尾倏v流量?
- 面試現(xiàn)場第三期:你要如何準(zhǔn)備—場技術(shù)面試呢?
- 計(jì)數(shù)系統(tǒng)設(shè)計(jì)(一):面對(duì)海量數(shù)據(jù)的計(jì)數(shù)器要如何做
- 計(jì)數(shù)系統(tǒng)設(shè)計(jì)(二):50萬 Q PS下如何設(shè)計(jì)未讀數(shù)系統(tǒng)
- 信息流設(shè)計(jì)(一):通用信息流系統(tǒng)的推理模式要如何做
- 信息流設(shè)計(jì)(二):通用信息流系統(tǒng)的拉模式要如何做
- 高并發(fā)下如何發(fā)現(xiàn)和排查問題?
- 我們?nèi)绾螠?zhǔn)備抵抗流量峰值?
答案解析原件(如下圖,內(nèi)容過多近400頁的高并發(fā)系統(tǒng)設(shè)計(jì)文檔,無法一一將答案上傳,但皆可分享原件給感興趣想學(xué)習(xí)的你,私信@追逐仰望星空口令【高級(jí)】即可)
高并發(fā)系統(tǒng)設(shè)計(jì)
此外,怎么肝下MySQL?
想肝MySQL說難也還行吧,不說別的,我準(zhǔn)備了167道超高頻的MySQL面試問題(附解析,包含從基礎(chǔ)-索引-鎖-日志-調(diào)優(yōu)等內(nèi)容),想做Java高級(jí)程序員乃至Java架構(gòu)師,想拿阿里P7-P8的offer,先將下面這些內(nèi)容裝進(jìn)腦子里吧!
MySQL
答案解析原件(如下圖,內(nèi)容過多64頁的167道超高頻的MySQL面試文檔,無法一一將答案上傳,但已整理如下的文檔)
MySQL
為了邁向高級(jí)程序員,那么這份 MySQL高級(jí)知識(shí)筆記手寫文檔(12章節(jié)內(nèi)容) 同樣不可錯(cuò)過!!
- MySql重要性質(zhì)
- MySQL安裝
- Mysql權(quán)限
- MySql數(shù)據(jù)類型
- Mysql架構(gòu)
- 存儲(chǔ)引擎
- 鎖
- 事務(wù)
- 業(yè)務(wù)設(shè)計(jì)
- 慢查詢
- 索引與執(zhí)行計(jì)劃
- SQL優(yōu)化
面試突擊MySQL,哪怕涉及高并發(fā)系統(tǒng)設(shè)計(jì)的內(nèi)容,千萬不要慌張!沉著!冷靜!






