原创 【MySQL(十就)】複製 過程

主庫將數據寫入本地binlog文件中; 從庫連接,指定起始位置; 主庫的binlog dump線程開始將binlog內容發送給從庫; 從庫的io線程將收到的binlog內容寫入到本地的relay log中; 從庫的sql線程將relay

原创 【MySQL(十八)】事務 兩段式提交

mysql在事務執行時,需要寫入兩種日誌,一種是server層的binlog,另一種是引擎層的redo log。事務commit時,以上兩種類型的日誌的寫入需要遵循兩段式提交協議。 什麼是兩段式提交? 爲了保證分佈式事務場景下事務的一致性

原创 MySQL(十三)】Innodb 表空間

數據的基本單位是頁,而頁又屬於各種表空間,比如系統表空間和獨立表空間等。表空間裏是如何組織數據的? 這裏主要看下獨立表空間的情況。 每64個連續的頁組成一個區(extent),頁的大小是16kb,一個區大小也就是1mb。每256個區呢又可

原创 MySQL(十六)】更新丟失 解決方案

一個比較見的業務場景,先從表裏讀一條數據的一列,然後在內存中計算該列的新值,最後再update新值到表裏: select data from table where id = xxx; // db newdate = data + 1

原创 MySQL(十四)】事務 MVCC機制

事務的四大特性:Atomicity(原子性),Isolation(隔離性),Consistency(一致性)和Durability(持久性)。 重點說下隔離性,指的是多個事務並行執行時,效果上就像一個一個執行的。沒有因爲是並行而導致問題。

原创 【MySQL(九)】字符集

編碼:字符 -> 二進制; 解碼:二進制 -> 字符; 爲什麼會出現亂碼?因爲編碼和解碼的規則不同。本質上都是同樣的一串二進制流,按照不同的規則解讀的結果當然是不同的。類比一下我們的時間戳轉時間的場景,時間戳就好比是二進制,時區就好比是不

原创 MySQL(十七)】redo log

mysql使用WAL機制,在執行更新操作時並不會直接寫盤,而是先記redo log。 redo log格式 (本篇圖片全部來自掘金小冊中《MySQL是怎樣運行的》一書) type:innodb有很多類型的redo log格式,比如指定不

原创 MySQL(十二)】Innodb b樹索引頁

上一篇看了存儲用戶數據的索引頁結構,這裏再看下b樹索引是怎麼存的。 本質上b樹索引也是存在索引頁這一種類型的頁上的,和一樣。不同的點在於user records區域存的內容不用而已。索引只需要存儲索引值+頁號即可,如果不是主鍵索引,還需要

原创 MySQL(十一)】Innodb 頁結構

Innodb以頁爲單位存儲數據,是操作磁盤的基本單位。一頁是16kb大小。有多種類型的頁,這裏看下存儲數據和索引的頁,叫做index page。一個index page主要包含以下7部分信息: (本篇圖片全部來自掘金小冊中《MySQL是

原创 【MySQL(十)】Innodb 行結構

以Innodb引擎爲例。 mysql數據邏輯上是一行一行存放的,物理上,則是以頁單位存放的,頁也是mysql操作的基本單位。一頁大小一般是16kb。 下面看下頁內具體一行數據的模型,也就是Innodb的行模式。共有四種:Compact、R

原创 MySQL(十五)】next-key lock

之前介紹過,sql標準中,rr級別並不能解決幻讀問題,那麼mysql是如何在rr級別解決幻讀問題的? 鎖協議 在非序列化隔離級別下,普通讀數據是快照讀,寫數據則要加X鎖,並且遵循兩段式鎖協議。也就是申請的鎖會一直佔用,直到事務提交。 幻讀

原创 【MySQL(四)】change buffer機制

change buffer是針對數據庫的更新語句做的一種優化。之前介紹過,wal機制是一種更新語句的優化,可以將磁盤隨機寫轉變爲磁盤順序寫。那麼change buffer 又是如何優化的呢? 個人理解:wal是使用了redo log,在磁

原创 【MySQL(三)】buffer pool相關

buffer pool是一種減少磁盤io讀的機制,原理是將訪問過的磁盤數據暫留在內存中,這樣下次訪問相同的數據就不需要讀磁盤了。這個思想在平時的開發中,也經常用到,比如我們通常會在數據庫前加一層memcache以及redis的緩存,防止熱

原创 【MySQL(七)】髒頁

髒頁的定義是內存中和磁盤中的不一致頁。 那麼髒頁是如何產生的? 在之前的介紹中,我們明白了innodb引擎是如何執行更新操作的。大致是:如果數據頁在內存中,直接更新內存並寫redo log;否則將磁盤中的數據頁載入到內存中,更新內存並寫r

原创 【MySQL(八)】一致性非鎖定讀 鎖定讀

mysql的鎖有若干種分類標準,這裏看下行鎖中的讀鎖與寫鎖。 讀鎖即S鎖,也叫共享鎖,當事務讀取一行數據時,會嘗試在記錄上加S鎖; 寫鎖即X鎖,也叫排它鎖,當事務要更新或者刪除一行數據時,會嘗試在記錄上加X鎖; 只有S鎖和S鎖是互相兼容的