SQL 調(diào)優(yōu)三板斧,拿好拿穩(wěn)了!

Java技術(shù)棧
www.javastack.cn
關(guān)注閱讀更多優(yōu)質(zhì)文章

前言

這么多年的風(fēng)里雨里多少有些技術(shù)上的技巧可以分享給大家。還記得有個(gè)曾經(jīng)抖落過一段小插曲嗎,發(fā)生在網(wǎng)管裝機(jī)那個(gè)時(shí)代。
裝機(jī)對(duì)于那個(gè)年代來說,其實(shí)沒有太大的懸念。但外行看著還是覺得很高深。我們拿出螺絲刀,把風(fēng)扇,CPU,內(nèi)存,硬盤拔下來的瞬間,大家都是覺得不可思議的。我能感覺到他們的心疼,畢竟一臺(tái)PC還要7,8000的時(shí)候,被我這么折騰,還是心有余悸。
但是我們老手都知道,洗手,拆箱,插拔,只要不帶電操作,安全得很。甚至只要聽到BIOS(年輕人估計(jì)都不知道了吧)的三長兩短聲,立馬可辨,是內(nèi)存,還是硬盤有問題了。拆裝到位,一擊即中。
上面是硬件部分的維護(hù),那到軟件部分怎么樣呢?網(wǎng)上不去,軟件卡了,黑屏,藍(lán)屏?套路與硬件故障排除一樣,重插網(wǎng)線,重啟電腦(萬惡的Windows 98),卸載軟件重裝,最后萬靈的一招,PE重裝系統(tǒng),Ghost 備份!
現(xiàn)專注于數(shù)據(jù)庫開發(fā)了,碰到性能有問題,其實(shí)和硬件故障排除并沒有多大區(qū)別,也有個(gè)套路。

第一板斧

跟上不了網(wǎng)一樣,第一件事情,大家會(huì)做什么?對(duì),就是檢查網(wǎng)線。
SQL查詢太慢,你會(huì)做什么?肯定不是去看網(wǎng)線了,網(wǎng)線一斷,你的SQL直接報(bào)timeout錯(cuò)誤了,根本不給你往下執(zhí)行的機(jī)會(huì)。
SQL查詢太慢,我們要做的事情當(dāng)然是去檢查,當(dāng)前的SQL是不是在跑?還是在等CPU中央司令員給你機(jī)會(huì)去跑。數(shù)據(jù)庫有自己的任務(wù)分配系統(tǒng),如果你的線程級(jí)別比較低,分配系統(tǒng)就不給你機(jī)會(huì)去執(zhí)行,那也白搭。那就只能等著了。
同學(xué)可能不知道為什么要等待,而不是發(fā)完SQL就立即執(zhí)行這個(gè)概念!
舉例,如果我們的數(shù)據(jù)庫有分布式的應(yīng)用,比如讀寫分離,那么在系統(tǒng)正在執(zhí)行讀寫分離的時(shí)候,會(huì)有大量的任務(wù)在跑,而且級(jí)別較高,占用的服務(wù)器資源就會(huì)很多,比如高CPU,高內(nèi)存,高IO.這個(gè)時(shí)候,任何的查詢都會(huì)被掛起,只有等待CPU/Memory/io的分配,才能 運(yùn)行。

第二板斧

平時(shí)大家都是寫 CRUD 的任務(wù)多,很少有人會(huì)去看數(shù)據(jù)庫的實(shí)現(xiàn)代碼。所以很多細(xì)節(jié)不會(huì)清楚。但很多廠商為我們做好了可以瞥一眼神秘的數(shù)據(jù)庫引擎實(shí)現(xiàn)的地方,那就是 execution plan(執(zhí)行計(jì)劃).?
在執(zhí)行計(jì)劃中,我們可以看到數(shù)據(jù)到底存儲(chǔ)在哪個(gè)硬盤位置,內(nèi)核是如何讀取這些硬盤位置的數(shù)據(jù),數(shù)據(jù)加載到內(nèi)存后,又經(jīng)過什么算法來得到我們想要的計(jì)算結(jié)果。

第三板斧

第三板斧,有些深入細(xì)節(jié)了。運(yùn)行時(shí)統(tǒng)計(jì)信息的采樣分析。
我們從IBM的論文中,可以得到這么個(gè)啟示。很多引擎的算法都得益于采集到的元數(shù)據(jù)統(tǒng)計(jì)信息。基于這些信息,引擎會(huì)自動(dòng)選擇最優(yōu)的算法。
比如一張表的Country字段(存儲(chǔ)國家信息),經(jīng)過統(tǒng)計(jì),只有3個(gè)國家,中國,美國,歐盟。其中包含中國的記錄數(shù)占據(jù)了85%的數(shù)據(jù),而其他兩國都只有7%,8%的數(shù)據(jù)。
如果有查詢需要查詢包含中國相關(guān)的數(shù)據(jù),那么采用全表/全索引掃描的方式會(huì)快很多,因?yàn)榛乇磉@部分(如果不知道回表,可以往前翻翻我的文章)的成本就被極大的節(jié)約了。一旦查詢其他兩國,那么使用索引搜索更快。你發(fā)現(xiàn)某個(gè)查詢?cè)诓樵儼袊嚓P(guān)數(shù)據(jù)時(shí),執(zhí)行計(jì)劃走的是 index seek, 你就可以幫執(zhí)行計(jì)劃調(diào)整成 index scan 或者table scan了。(同樣,如果不知道怎么調(diào)執(zhí)行計(jì)劃,可以翻翻我之前的文章)

結(jié)尾

總結(jié)下來,就是檢查等待,分析執(zhí)行計(jì)劃,運(yùn)行時(shí)統(tǒng)計(jì)信息采集。如果能從這三個(gè)方面去分段調(diào)試,肯定能找到80%的性能問題。那么,找到問題等于解決了問題嗎?肯定不是的。
點(diǎn)擊「閱讀原文」獲取面試題大全~
