<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1895字,需瀏覽 4分鐘

           ·

          2020-07-27 19:19

          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%的性能問題。那么,找到問題等于解決了問題嗎?肯定不是的。

          最近熱文:
          1、盤點(diǎn) 6 個(gè)被淘汰的 Java 技術(shù),曾經(jīng)風(fēng)光過!
          2、Spring Boot 如何快速集成 Redis?
          3、Spring Boot Redis 實(shí)現(xiàn)分布式鎖,真香!
          4、Mybatis 框架 SQL 注入攻擊的 3 種方式!
          5、Java 14 祭出神器,Lombok 被干掉了?
          6、Java 14 祭出增強(qiáng)版 switch,真香!!
          7、Spring Boot 2.3 優(yōu)雅關(guān)閉新姿勢(shì),真香!
          8、Spring Boot 干掉了 Maven 擁抱 Gradle!
          9、公司來了個(gè)新同事不會(huì)用 Lombok!
          10、Spring Cloud 2020 版本重大變革!
          掃碼關(guān)注Java技術(shù)棧公眾號(hào)閱讀更多干貨。

          點(diǎn)擊「閱讀原文」獲取面試題大全~

          瀏覽 76
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  蜜芽成人在线视频 | 老鸭窝欧美视频 | 亚洲日韩一级精品片在线播放 | 亚洲免费日本精品在线观看 | 成人在线2 |