更新時(shí)間:2022-12-28 15:43:36 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1252次
1.數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
其實(shí)一般業(yè)務(wù)開發(fā)中, 這個(gè)關(guān)注的不多,估計(jì)是一些偏極客的團(tuán)隊(duì)關(guān)注的比較多些
使表占用盡量少的磁盤空間。減少磁盤I/O次數(shù)及讀取數(shù)據(jù)量是提升性能的基礎(chǔ)原則。表越小,數(shù)據(jù)讀寫處理時(shí)則需要更少的內(nèi)存,同時(shí),小表的索引占用也相對(duì)小,索引處理也更加快速。
MySQL支持不同類型的存儲(chǔ)引擎和行格式,針對(duì)不同類型,業(yè)務(wù)需求的表應(yīng)該設(shè)置合適的存儲(chǔ)引擎及索引方法。表設(shè)置建議如下:
表列
行格式
壓縮類型的行格式,包括COMPACT, DYNAMIC, 和 COMPRESSED,對(duì)于特定操作,減少了存儲(chǔ)空間占用,但是增加了CPU計(jì)算能力使用。如果主要的負(fù)載在緩存命中率及磁盤讀寫速度,那么這種格式將能夠提升數(shù)據(jù)庫反應(yīng)速度。如果是極端情況負(fù)載受限于CPU性能,那么使用這種格式則會(huì)降低數(shù)據(jù)庫性能。
壓縮行格式也會(huì)對(duì)使用utf8mb3 或者 utf8mb4格式的變長CHAR 類型列存儲(chǔ)進(jìn)行優(yōu)化處理。對(duì)于使用ROW_FORMAT=REDUNDANT, CHAR(N) 定義的表,每個(gè)列值最多占用 N × 個(gè)字節(jié)長度。許多語言可以使用但字節(jié)的utf8格式表示,所以規(guī)定那個(gè)長度的定義通常會(huì)造成空間浪費(fèi)。壓縮行格式定義下,InnoDB 會(huì)每一個(gè)列值分配一個(gè)N 到 N× 個(gè)字節(jié)的空間。
2.MySQL數(shù)據(jù)庫cpu飆升到500%的話, 應(yīng)該怎么處理?
當(dāng) cpu 飆升到 500%時(shí),先用操作系統(tǒng)命令 top 命令觀察是不是 mysqld 占用導(dǎo)致的,如果不是,找出占用高的進(jìn)程,并進(jìn)行相關(guān)處理。
如果是 mysqld 造成的, show processlist,看看里面跑的 session 情況,是不是有消耗資源的 sql 在運(yùn)行。找出消耗高的 sql,看看執(zhí)行計(jì)劃是否準(zhǔn)確, index 是否缺失,或者實(shí)在是數(shù)據(jù)量太大造成。
一般來說,肯定要 kill 掉這些線程(同時(shí)觀察 cpu 使用率是否下降),等進(jìn)行相應(yīng)的調(diào)整(比如說加索引、改 sql、改內(nèi)存參數(shù))之后,再重新跑這些 SQL。
也有可能是每個(gè) sql 消耗資源并不多,但是突然之間,有大量的 session 連進(jìn)來導(dǎo)致 cpu 飆升,這種情況就需要跟應(yīng)用一起來分析為何連接數(shù)會(huì)激增,再做出相應(yīng)的調(diào)整,比如說限制連接數(shù)等
show full processlist 可以看到所有鏈接的情況,但是大多鏈接的 state 其實(shí)是 Sleep 的,這種的其實(shí)是空閑狀態(tài),沒有太多查看價(jià)值
我們要觀察的是有問題的,所以可以進(jìn)行過濾:
-- 查詢非 Sleep 狀態(tài)的鏈接,按消耗時(shí)間倒序展示,自己加條件過濾
select id, db, user, host, command, time, state, info
from information_schema.processlist
where command != 'Sleep'
order by time desc
總結(jié):
CPU報(bào)警:很可能是 SQL 里面有較多的計(jì)算導(dǎo)致的
連接數(shù)超高:很可能是有慢查詢,然后導(dǎo)致很多的查詢?cè)谂抨?duì),排查問題的時(shí)候可以看到”事發(fā)現(xiàn)場“類似的 SQL 語句一大片,那么有可能是沒有索引或者索引不好使,可以用:explain 分析一下 SQL 語句
3.MySQL的復(fù)制原理以及流程
MySQL主從復(fù)制工作原理
復(fù)制過程
4、讀寫分離有哪些解決方案?
讀寫分離是依賴于主從復(fù)制,而主從復(fù)制又是為讀寫分離服務(wù)的。因?yàn)橹鲝膹?fù)制要求slave不能寫只能讀(如果對(duì)slave執(zhí)行寫操作,那么show slave status將會(huì)呈現(xiàn)Slave_SQL_Running=NO,此時(shí)你需要按照前面提到的手動(dòng)同步一下slave)。
方案一
方案二
都訪問salve庫,這樣對(duì)于dao層都是透明。 plugin實(shí)現(xiàn)時(shí)可以通過注解或者分析語句是讀寫方法來選定主從庫。不過這樣依然有一個(gè)問題,也就是不支持事務(wù), 所以我們還需要重寫一下DataSourceTransactionManager, 將read-only的事務(wù)扔進(jìn)讀庫,其余的有讀有寫的扔進(jìn)寫庫。
方案三
以上就是“大廠整理出來的mysql優(yōu)化面試題目”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743