中國福建網(wǎng)

當前位置:中國福建網(wǎng) > 經(jīng)濟 > 正文

數(shù)據(jù)庫優(yōu)化漸進的過程,這些你都知道?

作者: 編輯 來源:互聯(lián)網(wǎng) 發(fā)布時間:2019-01-06

┊文章閱讀:

大家在面試的時候經(jīng)常會被問到數(shù)據(jù)庫優(yōu)化的問題,今天給大家總結(jié)了幾點:

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

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

因為這一步成本最低啊,不需要加什么中間件。

那步驟是什么樣呢?我說個大概

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

用explain分析SQL的執(zhí)行計劃

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

第二階段 使用緩存

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

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

緩存和數(shù)據(jù)庫一致性問題?(比如是更緩存,還是刪緩存)

緩存擊穿、緩存穿透、緩存雪崩問題如何解決?是否有做緩存預(yù)熱的必要。不過我猜,大部分中小公司應(yīng)該都沒考慮。

第三階段 讀寫分離

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

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

1.主從的好處?

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

2.主從的原理?

回答:如圖所示

主庫有一個log dump線程,將binlog傳給從庫

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

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

回答:這個問題,我不建議在數(shù)據(jù)庫層面解決該問題。根據(jù) CAP 定理,主從架構(gòu)本來就是一種高可用架構(gòu),是無法滿足一致性的。

哪怕你采用同步復(fù)制模式或者半同步復(fù)制模式,都是弱一致性,并不是強一致性。所以,推薦還是利用緩存,來解決該問題。

步驟如下:

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

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

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

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

說句實在話,你們面試的時候,其實可以略過這個階段。因為很多互聯(lián)網(wǎng)公司都不建議用分區(qū)表,我自己也不太建議用分區(qū)表,采用這個分區(qū)表,坑太多。

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

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

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

缺點

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

在分區(qū)表使用ALTER TABLE … ORDER BY,只能在每個分區(qū)內(nèi)進行order by。

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

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

第五階段 垂直拆分

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

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

把不常用的字段單獨放在一張表。

把常用的字段單獨放一張表

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

第六階段 水平拆分

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

  • 牙齒美容
  • 好愛卡
  • pe管
  • 裝修平臺
  • 植物提取物網(wǎng)
  • 源碼論壇
  • 激光打標機
  • 丹泊儀器
  • 礦山生態(tài)修復(fù)
  • 青島月子會所
  • 南京刑事律師