mysql底層是有三種日誌檔案:undo、redo、binlog,這裡我們是以innodb儲存引擎為例的,為什麼要牽扯去儲存引擎呢,因為undo、redo是屬於innodb儲存引擎的,binlog才是屬於mysql server的日誌檔案
這裡我們通過sql語句:update student name = 『xx』 where id = 1;
來分析一下著三種日誌檔案的作用
首先我們都知道在innodb底層有個關鍵的快取池buffer pool,在我們執行 update student name = 『xx』 where id = 1;時也是通過修改緩衝池buffer pool的值來進行的,我們通過下面的流程圖來分析一下這個原理:
這裡主要流程我們可以分為如下幾步:
載入磁碟檔案到 buffer pool 緩衝池中
將未修改的資料寫入undo日誌中,作用:便於資料回滾
更新快取buffer pool 的資料
寫入redo日誌,redo日誌則是記錄了對哪個資料做了修改
準備提交事務將redo日誌寫入磁碟
準備提交事務將binlog日誌寫入磁碟(binlog日誌記錄對哪個資料做了修改,修改結果是什麼)
將binlog更新的檔名和更新檔案的位置寫入redo,並在redo log新增commit標記
io執行緒隨機將 buffer pool 緩衝池中的資料刷入磁碟
為什麼乙個簡單的更新操作在mysql底層會弄的這麼複雜呢?這裡我們來簡單分析一下
-這是我們對資料回滾的依賴
這個很容易理解,任何和磁碟有關的操作效能都是極低的所以,所以mysql會引入buffer pool,首先是更新快取,非常快,最後在空閒的時候通過後台io隨機更新到磁碟。
redo日誌記錄了修改後的值,防止我們資料丟失,假如我們修改了buffer pool快取中的值,還沒有來得及重新整理磁碟中的資料,資料庫宕機了,那麼buffer pool快取中的資料丟失不是讓磁碟中這一條資料成了髒資料嗎?但是因為有redo日誌,可以通過redo日誌恢復所以是不要緊的。redo在設定中其實是有幾種刷盤策略的,這裡我們可以簡單的了解下:
他是通過引數innodb_flush_log_at_trx_commit配置的
當引數為0時,提交事務不會將redo日誌強制刷入磁碟
當引數為1時,提交事務成功一定會將redo日誌寫入磁碟
當引數為2時,提交事務時將redo日誌寫入os cache快取中,1秒後寫入磁碟
這裡三個引數建議是設定為1,強制寫入磁碟,雖然對效能會有影響,但是可以保證資料的不丟失
對於binlog日誌其實也是有個引數控制刷盤策略的,就是 sync_binlog,預設為0表示不是直接寫入磁碟,也是先寫入os cache快取中,所以這裡建議是吧sync_binlog引數設定為1,強制在提交事務的時候寫入磁碟
這裡是為了保證binlog和redo日誌的一致性,假設redo日誌剛剛寫入磁碟檔案後mysql宕機了,不會因為redo日誌有資料而binlog沒有資料產生資料不一致問題,因為redo日誌檔案沒有最終標記commit,所以這次事務是提交失敗的
面試官 說說你知道的幾種負載均衡分類
負載均衡其實就是任務的分發,使得任務能按照你的預想分配到各個計算單元上,它能提高服務對外的效能,避免單點失效場景。這裡要注意的一點是雖說叫負載均衡,但是有時候我們的分配演算法就是不是均衡的。比如配個nginx,做兩台伺服器的負載均衡,一台機子比較老是以前的配置比較低,一台是新機子配置高,那我們的分配...
面試你的面試官
大多數面試都是面試官從簡歷,學歷,經歷,技術,為人上對你 乙個求職者 一番拷問,以確定是否是他們想要的人。而這些對找到適合你的工作的確沒什麼用。某公司某職位需要你,而某公司某職位不一定是你想要的!如果你想找到適合你的公司 如果你想找到適合你的職位 記得面試你的面試官,沒錯!做出很重要的職業決定前,面...
面試官 說說var let const之間的區別
故心故心故心故心小故衝啊 在es5中,頂層物件的屬性和全域性變數是等價的,用var宣告的變數既是全域性變數,也是頂層變數 注意 頂層物件,在瀏覽器環境指的是window物件,在 node 指的是global物件 var a 10 console.log window.a 10 使用var宣告的變數存...