數(shù)據(jù)庫慢查詢優(yōu)化的一個(gè)回答
之前字節(jié)二面的一個(gè)問題,個(gè)人覺得答的尚可,記錄一下答案歡迎評論區(qū)指正和補(bǔ)充
回答:
首先我們分情況討論,對于我們索引,首先explain打一下查詢計(jì)劃,看看key字段走的是哪個(gè)索引,如果出現(xiàn)回表的情況是否可以優(yōu)化,然后如果是聯(lián)合索引就看看len字段走了幾個(gè)索引,當(dāng)然最重要還是看type字段是否走了索引。然后我們針對性的對索引失效,或者回表等情況優(yōu)化。
然后深分頁也會導(dǎo)致一個(gè)慢查詢的情況,尤其是limit字段,有兩種方式一個(gè)是建立子查詢先把主鍵id查出來然后根據(jù)id走索引,還有就是像你們抖音短視頻下拉刷新這個(gè)分頁場景,可以把利用游標(biāo)的方式將上一次查詢的主鍵id作為下一次查詢的參數(shù)傳入優(yōu)化我們的查詢
當(dāng)然我們數(shù)據(jù)庫的sql語句也可以優(yōu)化,比如為了方便我們數(shù)據(jù)庫的連接join操作可以先將我們查詢的字段先進(jìn)行限制和投影,減少我們連接操作涉及的字段
當(dāng)然我們拋開業(yè)務(wù)取談設(shè)計(jì)也不可取,對于特定業(yè)務(wù)可以進(jìn)行反范式的設(shè)計(jì),引入一些冗余字段,特別是像商品spu和sku這種聚合查詢的情況
#字節(jié)跳動# #后端#
回答:
首先我們分情況討論,對于我們索引,首先explain打一下查詢計(jì)劃,看看key字段走的是哪個(gè)索引,如果出現(xiàn)回表的情況是否可以優(yōu)化,然后如果是聯(lián)合索引就看看len字段走了幾個(gè)索引,當(dāng)然最重要還是看type字段是否走了索引。然后我們針對性的對索引失效,或者回表等情況優(yōu)化。
然后深分頁也會導(dǎo)致一個(gè)慢查詢的情況,尤其是limit字段,有兩種方式一個(gè)是建立子查詢先把主鍵id查出來然后根據(jù)id走索引,還有就是像你們抖音短視頻下拉刷新這個(gè)分頁場景,可以把利用游標(biāo)的方式將上一次查詢的主鍵id作為下一次查詢的參數(shù)傳入優(yōu)化我們的查詢
當(dāng)然我們數(shù)據(jù)庫的sql語句也可以優(yōu)化,比如為了方便我們數(shù)據(jù)庫的連接join操作可以先將我們查詢的字段先進(jìn)行限制和投影,減少我們連接操作涉及的字段
當(dāng)然我們拋開業(yè)務(wù)取談設(shè)計(jì)也不可取,對于特定業(yè)務(wù)可以進(jìn)行反范式的設(shè)計(jì),引入一些冗余字段,特別是像商品spu和sku這種聚合查詢的情況
#字節(jié)跳動# #后端#
全部評論
美團(tuán)技術(shù)有一個(gè)寫的很詳細(xì)的技術(shù)文章,關(guān)于慢查詢的解決辦法
在explain之前還可以先看一下慢查詢?nèi)罩荆热鏼ysql可以設(shè)置慢查詢的閾值并且拿到執(zhí)行時(shí)長超過閾值的sql,日志有鎖競爭的時(shí)間,如果鎖競爭的時(shí)間太長可以從并發(fā)的方向入手優(yōu)化,之后再常規(guī)優(yōu)化索引之類的。

慢查詢會導(dǎo)致N個(gè)數(shù)據(jù)庫連接Hang住,MySQL Server(數(shù)據(jù)庫服務(wù))的連接數(shù)是有限的,如果所有連接被慢查詢占住,然后客戶端又不斷想要獲取連接發(fā)送SQL,逐漸惡化,對用戶的體驗(yàn)就是功能無法正常使用,不斷報(bào)錯,而MySQL Server也可能會被打掛掉。
相關(guān)推薦
點(diǎn)贊 評論 收藏
分享
04-16 04:21
廣東培正學(xué)院 單片機(jī) 點(diǎn)贊 評論 收藏
分享
點(diǎn)贊 評論 收藏
分享