一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

數(shù)據(jù)庫優(yōu)化的幾個(gè)階段

 airen89 2018-12-23

引言

大家在面試的時(shí)候,是否遭遇過,面試官詢問

你們是如何進(jìn)行數(shù)據(jù)庫優(yōu)化的?

那這個(gè)問題應(yīng)該怎么答呢?其實(shí)寫這個(gè)題材的原因是我這幾天看到各公眾號轉(zhuǎn)的一篇數(shù)據(jù)庫調(diào)優(yōu)的知識(不上鏈接了),我就稍微翻了幾下,上面動不動就來說要對數(shù)據(jù)庫進(jìn)行水平拆分,我就想反問各位讀者,你們幾個(gè)人經(jīng)歷過水平拆分?現(xiàn)在很多文章,實(shí)踐性實(shí)在太差,只能說純理論分析。

這篇文章最早來自知乎的一個(gè)提問,我在其基礎(chǔ)上完善了一下。

第一階段 優(yōu)化sql和索引

這才是調(diào)優(yōu)的第一階段啊,為什么呢?

因?yàn)檫@一步成本最低啊,不需要加什么中間件。你沒經(jīng)過索引優(yōu)化和SQL優(yōu)化,就來什么水平拆分,這不是坑人么。

步驟是什么樣呢?我說個(gè)大概

  1. 用慢查詢?nèi)罩径ㄎ粓?zhí)行效率低的 SQL語句

  2. 用 explain分析 SQL的執(zhí)行計(jì)劃

  3. 確定問題,采取相應(yīng)的優(yōu)化措施,建立索引啊,等

我就不舉例了,因?yàn)槿绾蝺?yōu)化SQL的文章,一抓一大把,再貼過來,讀者看著也累。

第二階段 搭建緩存

在優(yōu)化sql無法解決問題的情況下,才考慮搭建緩存。畢竟你使用緩存的目的,就是將復(fù)雜的、耗時(shí)的、不常變的執(zhí)行結(jié)果緩存起來,降低數(shù)據(jù)庫的資源消耗。

這里需要注意的是:搭建緩存后,系統(tǒng)的復(fù)雜性增加了。你需要考慮很多問題,比如:

第三階段 讀寫分離

緩存也搞不定的情況下,搞主從復(fù)制,上讀寫分離。在應(yīng)用層,區(qū)分讀寫請求?;蛘呃矛F(xiàn)成的中間件 mycat或者 altas等做讀寫分離。

需要注意的是,只要你敢說你用了主從架構(gòu),有三個(gè)問題,你要準(zhǔn)備:

1.主從的好處?

回答:實(shí)現(xiàn)數(shù)據(jù)庫備份,實(shí)現(xiàn)數(shù)據(jù)庫負(fù)載均衡,提高數(shù)據(jù)庫可用性

2.主從的原理?

回答:如圖所示(圖片不是自己畫的,偷懶了)

主庫有一個(gè) logdump線程,將 binlog傳給從庫

從庫有兩個(gè)線程,一個(gè)I/O線程,一個(gè)SQL線程,I/O線程讀取主庫傳過來的 binlog內(nèi)容并寫入到 relay log,SQL線程從 relay log里面讀取內(nèi)容,寫入從庫的數(shù)據(jù)庫。

3.如何解決主從一致性?

回答:這個(gè)問題,我不建議在數(shù)據(jù)庫層面解決該問題。根據(jù) CAP 定理,主從架構(gòu)本來就是一種高可用架構(gòu),是無法滿足一致性的。 哪怕你采用同步復(fù)制模式或者半同步復(fù)制模式,都是弱一致性,并不是強(qiáng)一致性。所以,推薦還是利用緩存,來解決該問題。

步驟如下:

  1. 自己通過測試,計(jì)算主從延遲時(shí)間,建議mysql版本為5.7以后,因?yàn)閙ysql自5.7開始,多線程復(fù)制功能比較完善,一般能保證延遲在1s內(nèi)。不過話說回來,mysql現(xiàn)在都出到8.x了,還有人用5.x的版本么。

  2. 數(shù)據(jù)庫的寫操作,先寫數(shù)據(jù)庫,再寫cache,但是有效期很短,就比主從延時(shí)的時(shí)間稍微長一點(diǎn)。

  3. 讀請求的時(shí)候,先讀緩存,緩存存在則直接返回。如果緩存不存在(這時(shí)主從同步已經(jīng)完成),再讀數(shù)據(jù)庫。

第四階段 利用分區(qū)表

說句實(shí)在話,你們面試的時(shí)候,其實(shí)可以略過這個(gè)階段。因?yàn)楹芏嗷ヂ?lián)網(wǎng)公司都不建議用分區(qū)表,我自己也不太建議用分區(qū)表,采用這個(gè)分區(qū)表,坑太多。

這里引用一下其他文章的回答:

什么是mysql的分區(qū)表?

回答:所有數(shù)據(jù)還在一個(gè)表中,但物理存儲根據(jù)一定的規(guī)則放在不同的文件中。這個(gè)是mysql支持的功能,業(yè)務(wù)代碼不需要改動,但是sql語句需要改動,sql條件需要帶上分區(qū)的列。

缺點(diǎn)

  1. 分區(qū)鍵設(shè)計(jì)不太靈活,如果不走分區(qū)鍵,很容易出現(xiàn)全表鎖

  2. 在分區(qū)表使用 ALTER TABLE … ORDER BY,只能在每個(gè)分區(qū)內(nèi)進(jìn)行 orderby。

  3. 分區(qū)表的分區(qū)鍵創(chuàng)建索引,那么這個(gè)索引也將被分區(qū)。分區(qū)鍵沒有全局索引一說。

  4. 自己分庫分表,自己掌控業(yè)務(wù)場景與訪問模式,可控。分區(qū)表,研發(fā)寫了一個(gè)sql,都不確定該去哪個(gè)分區(qū)查,不太可控。 …不列舉了,不推薦

第五階段 垂直拆分

上面四個(gè)階段都沒搞定,就來垂直拆分了。垂直拆分的復(fù)雜度還是比水平拆分小的。將你的表,按模塊拆分為不同的小表。大家應(yīng)該都看過《大型網(wǎng)站架構(gòu)演變之路》,這種類型的文章或者書籍,基本都有提到這一階段。

如果你有幸能夠在什么運(yùn)營商、銀行等公司上班,你會發(fā)現(xiàn)他們一個(gè)表,幾百個(gè)字段都是很常見的事情。所以,應(yīng)該要進(jìn)行拆分,拆分原則一般是如下三點(diǎn):

  1. 把不常用的字段單獨(dú)放在一張表。

  2. 把常用的字段單獨(dú)放一張表

  3. 經(jīng)常組合查詢的列放在一張表中(聯(lián)合索引)。

第六階段 水平拆分

OK,水平拆分是最麻煩的一個(gè)階段,拆分后會有很多的問題,我再強(qiáng)調(diào)一次,水平拆分一定是最最最最后的選擇。從某種意義上,我覺得還不如垂直拆分。因?yàn)槟阌么怪辈鸱?,分成不同模塊后,發(fā)現(xiàn)單模塊的壓力過大,你完全可以給該模塊單獨(dú)做優(yōu)化,例如提高該模塊的機(jī)器配置等。如果是水平拆分,拆成兩張表,代碼需要變動,然后發(fā)現(xiàn)兩張表還不行,再變代碼,再拆成三張表的?水平拆分后,各模塊間耦合性太強(qiáng),成本太大,慎重。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    人人爽夜夜爽夜夜爽精品视频| 欧美成人精品国产成人综合| 亚洲中文字幕人妻av| 国产一区一一一区麻豆| 国产精品推荐在线一区| 日韩人妻一区二区欧美| 欧美尤物在线观看西比尔| 亚洲日本中文字幕视频在线观看| 欧美日韩亚洲综合国产人| 久久免费精品拍拍一区二区| 不卡一区二区高清视频| 精品欧美一区二区三久久| 午夜激情视频一区二区| 天海翼高清二区三区在线| 微拍一区二区三区福利| 日本办公室三级在线观看| 中文字日产幕码三区国产| 国产传媒免费观看视频| 91久久精品中文内射| 在线观看那种视频你懂的| 午夜福利国产精品不卡| 国产丝袜美女诱惑一区二区| 日本欧美在线一区二区三区| 日韩精品一区二区三区射精| 亚洲精品国产第一区二区多人| 国产成人精品久久二区二区| 国产精品亚洲一级av第二区| 久久精品福利在线观看| 暴力性生活在线免费视频| 国产精品国产亚洲看不卡| 少妇激情在线免费观看| 国产综合一区二区三区av| 日本不卡一区视频欧美| 亚洲欧洲一区二区中文字幕| 国产又粗又长又爽又猛的视频| 亚洲国产精品一区二区| 亚洲欧美日韩精品永久| 欧美亚洲三级视频在线观看| 五月婷婷欧美中文字幕| 日本黄色录像韩国黄色录像| 国产又大又黄又粗的黄色|