<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數(shù)據(jù)庫性能胯了,換 SSD硬盤就能解決問題?

          共 3554字,需瀏覽 8分鐘

           ·

          2021-07-05 08:32

          點(diǎn)擊藍(lán)色“有關(guān)SQL”關(guān)注我喲

          加個“星標(biāo)”,天天與10000人一起快樂成長



          2010年,上海張江,傳奇廣場。

          這里匯集了各路公交車,是張江男女必爭之地。打工人最怕的是什么,不是996,不是007,最怕擠公交。

          背著5斤重的Dell, 頂著烈日,狂風(fēng),暴雨,滿懷希望沖向車站,換來的卻是,屢次被無情拋棄,這種感覺,誰經(jīng)歷,誰淚目。


          BMW, Bus + Metro + Walk 這種通勤方式,貫穿著張江男女的 30歲!


          “讓一讓,排好隊!” 車站調(diào)度員每次總要對落下的我們補(bǔ)上一句。語氣略有生硬,但嗓門絕對讓每個幻想插隊的人,都聽得到!

          這個車站不大,總共有 4 個車道,停歇了 7-8路車。618,636,張江1路,張南專線,張江環(huán)路,孫橋1路,等等


          調(diào)度員拿著硬板本,按時走過 4個車道,招呼該發(fā)車的司機(jī)出發(fā),并叮囑下一班次車準(zhǔn)備。每次看到有調(diào)度員過來,一些略顯頹廢的男女,立刻就來了精神。因?yàn)檎甲?,在這里也是門學(xué)問。

          有時,該發(fā)車的車道上,沒有找到司機(jī),調(diào)度員還會大罵一聲,氣哄哄跑去下一車道招呼其他司機(jī)。


          現(xiàn)今,基本上已經(jīng)看不到調(diào)度員的身影了,即使看到,也是他偶爾出來抽根煙。隨手還帶著對講機(jī)。

          沒錯,現(xiàn)在的調(diào)度口令,不需要口口相傳,對講機(jī)一開,司機(jī)就跳上車了。調(diào)度員手里的硬板本,也換成了電子公告牌,就像華泰證券交易所的紅綠看板一樣,哪個車道,下一班發(fā)什么車,走馬燈似的亮著。


          扯遠(yuǎn)了,拉回來,你們沒有走錯片場,我不是在寫小說!

          上面這個轉(zhuǎn)變,看似是電子信息化轉(zhuǎn)型,實(shí)際上也勝似機(jī)械硬盤過度到SSD(固態(tài)硬盤)。



          (摘自網(wǎng)絡(luò))


          這是機(jī)械硬盤的構(gòu)造圖。

          磁盤從里到外,分出很多磁道。磁道上挨個排滿了扇區(qū),每個扇區(qū)的存儲空間固定。

          磁頭圍繞著磁道轉(zhuǎn)一圈,該磁道上所有的扇區(qū)數(shù)據(jù)就會被讀到內(nèi)存里。這樣的讀叫做順序讀(順序IO)


          如果一個磁道把同一張表的數(shù)據(jù)都存儲起來,這樣的順序讀,效率是最高的,只需一圈,讀到所有的數(shù)據(jù)。

          但事情并不那么簡單。首先,數(shù)據(jù)的寫入,是無序的。比如一張表有100萬條數(shù)據(jù),這100萬條數(shù)據(jù),并不是連續(xù)地寫入,而是每天寫一點(diǎn)或者每過一段時間寫一點(diǎn)。寫入的同時,還會有表B,表C的數(shù)據(jù),挨著表A的某些數(shù)據(jù),一起寫入到相鄰的扇區(qū)中


          那么,同一個磁道上,就會出現(xiàn)既有表A的數(shù)據(jù),還有表B,表C的數(shù)據(jù)。這樣磁道上的數(shù)據(jù),就會有了斷層。表A的數(shù)據(jù)自然也就不會連續(xù)存在一個磁道上

          有可能磁道1存上那么2萬條,磁道2存上那么10萬條,磁道3存上那么5萬條,零零散散分布在幾十條不同的磁道上


          所以,與理論上完美的順序讀,不一樣的是,實(shí)際中,大部分表的數(shù)據(jù)是隨機(jī)讀(隨機(jī)IO)

          完全讀取表A 100萬的數(shù)據(jù),可能需要在幾十條不同磁道間來回切換。而讀取時,把其他表數(shù)據(jù)讀取出來,貌似做的都是無用功。


          因此,傳統(tǒng)的優(yōu)化,有一個方法就是磁盤碎片整理,目的就是提高順序讀的機(jī)會。當(dāng)然,建立索引也是提高順序讀的好方法。但OLTP系統(tǒng)中,充滿了隨機(jī)寫,索引也必須進(jìn)行碎片整理。


          以上是傳統(tǒng)磁盤的工作方式,也列舉了對數(shù)據(jù)庫操作的影響。那么SSD的出現(xiàn),又對數(shù)據(jù)庫的優(yōu)化產(chǎn)生了哪些影響呢?


          同樣,先要講下 SSD 的結(jié)構(gòu),正是由于這個結(jié)構(gòu)才對數(shù)據(jù)庫產(chǎn)生了深遠(yuǎn)的影響,而且這個影響不僅僅有正面的,還有負(fù)面的。

          SSD不再是簡單的一個存儲介質(zhì),而是一整套微小的系統(tǒng)。包含了內(nèi)置的芯片,緩存還有存儲介質(zhì)。

          (摘自網(wǎng)絡(luò))


          當(dāng)操作系統(tǒng)發(fā)送讀寫命令時,SSD就像是另外一臺計算機(jī),判斷內(nèi)存是否有緩存,根據(jù)FTL提供的映射表,從介質(zhì)上讀取/寫入數(shù)據(jù)。

          這些組件里最有意思的是 FTL(Flash Translation Layer), 即閃存譯層。它的主要功能是提供一份映射表,從閃存(Flash Memory)的物理地址映射到邏輯地址(Logical Block Address)


          那么為什么SSD的FTL這個組件能力那么強(qiáng),它對比傳統(tǒng)的磁盤到底快在哪里?


          再來回憶下,傳統(tǒng)的磁盤,一次隨機(jī)讀,耗時較長的兩個步驟,一是尋道;二是等待

          尋道,即尋找到特定數(shù)據(jù)的磁道;

          等待,在磁頭定位到磁道后,等待磁盤將扇區(qū)旋轉(zhuǎn)移動到磁頭下,這個延遲時間稱之為等待時間。

          正是由于這兩個限定因素,導(dǎo)致機(jī)械磁盤的效率,頂配了也就那么高了。


          那么SSD的電氣化閃存,為什么就會比機(jī)械磁盤高那么多呢?


          這個原理,開頭的小故事,已經(jīng)說得很明白了。


          調(diào)度員一個個車道走過來,這是尋道,萬一哪個道,到點(diǎn)了,但還沒有車輛就緒,就得跨道,找下一個可以發(fā)車的道;走到當(dāng)時可以發(fā)車的車道,呼叫可以發(fā)車的司機(jī),叮囑司機(jī)可以發(fā)車了,這是旋轉(zhuǎn)磁盤時的必要等待。

          這一來一回,中間出點(diǎn)叉子,都會無數(shù)的等待時間。所以經(jīng)常晚點(diǎn),當(dāng)時那叫一個痛苦。


          感謝電子化時代的到來?,F(xiàn)在的發(fā)車遠(yuǎn)比那時簡單高效。

          每個司機(jī)都配備對講機(jī),時間一到,調(diào)度根據(jù)排班(FTL)呼叫司機(jī)發(fā)車,省掉了尋道和等待時間(都靠人工)。調(diào)度員借用電子信息手段,瞬間就能傳達(dá)發(fā)車指令。


          但是,SSD就全是優(yōu)點(diǎn)嗎,絕對不是。它有個巨大的缺陷,就是寫入放大。


          這個缺陷和數(shù)據(jù)庫的預(yù)讀能力,其實(shí)有些類似。數(shù)據(jù)庫的讀取,一次讀取并不是一條一條的讀數(shù)據(jù),而是一頁乃至一個數(shù)據(jù)區(qū)的讀。明明只要一條數(shù)據(jù),對不起,存儲引擎會讀取上百條數(shù)據(jù)給你

          所以有時看到數(shù)據(jù)庫內(nèi)存使用量極大,總想著給它加點(diǎn)內(nèi)存,其實(shí)完全沒必要。它就是一貪嘴的小鬼,給多少就吃多少,不會嫌多。


          SSD 也有類似的機(jī)理,不過不是在讀取上,而是在寫入中。讀取可以完全做到一個頁一個頁的讀,但寫入就有分歧了。

          當(dāng)一塊新的SSD硬盤拿過來,開始寫入數(shù)據(jù)時,很快。見縫插針,哪兒涼快就哪兒呆著。不用思考。但是一旦SSD寫完了,需要改寫數(shù)據(jù)時,麻煩就來了。

          它的改寫原理是讀取一個數(shù)據(jù)塊的數(shù)據(jù),而不是一頁數(shù)據(jù)。這一個塊上的數(shù)據(jù),可能包含了幾十頁的數(shù)據(jù),而且這些數(shù)據(jù)都不需要修改。等到這些數(shù)據(jù)讀到內(nèi)存后,就選擇需要修改的數(shù)據(jù),逐條修改,然后寫回閃存。

          寫回閃存時,最大的延遲在于,需要把原先的那些讀取的數(shù)據(jù)頁都擦除,然后再寫入。

          這種情況,稱之為“寫入放大”


          所以你家的SSD是不是等過了一段時間,發(fā)現(xiàn)明顯的速度慢了?就是這個理,在等待垃圾塊(臟塊)的回收。


          像這種情況,存在于早期的SSD中,那時,SSD確實(shí)不適合用來做日志盤,只能用來做無傷大雅的快盤。后來優(yōu)化了FTL算法,比如進(jìn)行了碎片整理,垃圾回收,并且容量也日漸擴(kuò)大,慢慢SSD的應(yīng)用場景也就多起來了


          在OLAP領(lǐng)域,也就是數(shù)據(jù)分析,數(shù)據(jù)倉庫和報表系統(tǒng)中,SSD的應(yīng)用相當(dāng)廣泛。這類應(yīng)用寫入次數(shù)較少,但是讀取的吞吐量極大。

          有人說,SSD 的寫入放大缺陷,不適合用來存儲 redo log,其實(shí)也不是那么全面。有些 redo log不大,而 SSD 現(xiàn)在的容量極大,一次性寫完 SSD 而引起性能抖動的概率并不大。而且有了FTL的優(yōu)化,SSD完全有能力在日志寫滿前,就開始做垃圾回收和碎片整理。

          日志文件的訪問(主要是寫入),通??梢钥醋鍪窃诃h(huán)形跑道上跑馬拉松。一圈跑下來,運(yùn)動員丟棄的水瓶,補(bǔ)給堆滿了跑道。為了可以讓運(yùn)動員順利跑第二圈,第三圈,必須把這些水瓶等雜物清理干凈,越早處理,對運(yùn)動員就越有利,無感知最好

          SSD也一樣,在裝有 redo log 的SSD寫滿之前,就對SSD做閃存塊的整理,把空間都讓出來,才能讓數(shù)據(jù)寫入更快


          那么 SSD 是不是就一定比傳統(tǒng)的存儲系統(tǒng)優(yōu)越呢,其實(shí)也不一定。

          比如組RAID 磁盤陣列,擁有的讀寫能力就不比 SSD 差。

          通過表分區(qū),將數(shù)據(jù)打散,放在不同的硬盤上,這樣讀取數(shù)據(jù),就能有效利用并行。

          拿 SQL Server 來舉例:

          • c 盤:操作系統(tǒng)
          • D 盤:SQL Server 數(shù)據(jù)文件
          • E 盤:日志文件
          • F 盤:SQL Server 數(shù)據(jù)文件
          • G 盤:tempdb 文件

          其中,D和F盤做了 RAID 10, 當(dāng)100G的數(shù)據(jù)表做了分區(qū),將其中的時間戳,按照奇偶年,分別存儲在 D/F盤的數(shù)據(jù)文件中。


          這樣,當(dāng)需要查詢連續(xù)兩年的數(shù)據(jù),就可以充分發(fā)揮D/F盤并行查詢的效率

          只要成本可控,隨著數(shù)據(jù)盤的增多,分區(qū)可以打得更散,并行的速度就越快。這對于 SSD 來說,成本上是不過關(guān)的


          用SSD替換機(jī)械硬盤,現(xiàn)階段有好處,但瓶頸也不少。更多應(yīng)用,還是要在實(shí)際中做出一種平衡。



          --完--





          往期精彩:


          本號精華合集(三)

          外企一道 SQL 面試題,刷掉 494 名候選人

          我在面試數(shù)據(jù)庫工程師候選人時,常問的一些題

          零基礎(chǔ) SQL 數(shù)據(jù)庫小白,從入門到精通的學(xué)習(xí)路線與書單









          瀏覽 79
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  欧美一级特黄A片 | 国产精品无码在线播放 | 国产精品欧美精品 | 亚洲爱爱网站 | 国产裸舞|