可先談談mysql的體系結構,再從以下三個方面介紹innodb體系結構:
由於 utf8 的每個字元最多占用 3 個位元組。而 mysql 定義行的長度不能超過65535,因此 n 的最大值計算方法為:(65535-1-2)/3。
undo log和redo log是mysql中innodb儲存引擎的基本組成
當⼀個事務提交成功後,雖然緩衝池中的資料不⼀定來得及⻢上落地到磁碟中,但是redo log記錄的 事務資訊持久化到磁碟中了、且含有commit標記,此時如果mysql宕機導致緩衝池中的、已經被事務更新 過的記憶體資料丟失了,此時在mysql重啟時,將磁碟中的redo log中將事務變更資訊給載入到緩衝池中, 保證事務資訊不會丟失。或者redo log刷盤了,binlog寫成功了,在重啟時會⾃動給上commit標記,在重放資料。
事務先提交後刷盤
直接更新磁碟是隨機io寫,存在磁碟位址定址操作,效能非常低,承載不了⾼併發場景; 而轉換為innodb中,記憶體高速讀寫、redo log和undo log順序寫磁碟效能相對於隨機io寫效能會高的多,而這種效能上的提高足以抵消這種架構上帶來的複雜,可在⼀定qps內承載⾼併發場景。
主伺服器把資料更新記錄到二進位制日誌中,從伺服器通過i/o thread,向主庫發起binlog請求,主伺服器通過i/o dump thread 把二進位制日誌傳遞給從庫,從庫通過i/o thread 記錄到自己的中繼日誌中。然後通過sql thread應用中繼日誌sql的內容
sync_binlog=1
innode_flush_log_at_trx_commit=1
這兩個引數控制mysql磁碟寫入策略和資料安全性的
innode_flush_log_at_trx_commit設定為1,每次事務提交時都會把log buffer的資料寫入log file並刷到磁碟中
sync_binlog=n(n>0),在每寫n次二進位制日誌binary log時,會使用fdatasync()函式將其寫入二進位制日誌binary log同步到磁碟
使用自增列做主鍵,寫入順序是自增的,和b+樹葉子節點**順序一致。
innodb表的資料寫入順序能和b+樹索引的葉子節點順序一致時,儲存效率是最高的。
專業的笑一來就加索引的,加索引的笑不懂的
首先發現問題,通過以下四個維度找到問題所在
死鎖是指兩個或多個事務在同一資源上互相占用,並請求加鎖時導致的惡性迴圈想象。
當多個事務以不同順序試圖加鎖同一資源時,就會產生死鎖。
鎖等待:mysql資料庫中,不同session在更新同行資料時會出現鎖等待現象。
重要的三張鎖的監控表:innodb_trx、innodb_locks和innodb_lock_waits
可從mysql的五大知識模組出發:
例如:
MySQL 高頻面試題
1 什麼是索引?索引是一種資料結構,幫助我們快速的進行資料查詢。2 索引是什麼樣的資料結構?索引的資料結構與使用的儲存引擎實現有關,在mysql中使用較多有hash索引和b 樹索引等,而我們經常使用的innodb儲存引擎預設的索引實現為b 樹索引。3 hash索引和b 樹索引有什麼區別或者說優劣呢?...
mysql高頻更新 MySQL高頻面試題的靈魂拷問
唯一索引比普通索引快嗎,為什麼?唯一索引不一定比普通索引快,還可能慢.查詢時,在未使用limit 1的情況下,在匹配到一條資料後,唯一索引即返回,普通索引會繼續匹配下一條資料,發現不匹配後返回.如此看來唯一索引少了一次匹配,但實際上這個消耗微乎其微.更新時,這個情況就比較複雜了.普通索引將記錄放到c...
C 高頻面試題
malloc free是c語言的標準庫函式,new delete是c 的運算子。由於malloc free是庫函式而不是運算子,不在編譯器控制許可權之內。對於使用者自定義的物件而言,用maloc free無法滿足動態管理物件的要求。廢話 new是型別安全的,malloc不是。int a new fl...