第4版 高性能MySQL 第一章 MySQL架構 讀書筆記( 二 )


建議: 除了在禁用AUTOCOMMIT的事務中可以使用之外,其他任何時候都不要顯式地執行LOCK TABLES,不管使用的是什么存儲引擎.
多版本并發控制MySQL的大多數事務型存儲引擎使用的都不是簡單的行級鎖機制.它們會將行級鎖和可以提高并發性能的多版本并發控制(MVCC)技術結合使用.
不同數據庫的實現細節不一樣
可以認為MVCC是行級鎖的一種變種 它在很多情況下避免加鎖 因此開銷更低
通過數據快照實現

  • InnoDB為每個事務啟動時分配一個事務ID
  • 該事務修改記錄時 向Undo log寫入一條如何恢復回去的undo記錄 事務回滾指針指向該記錄
  • 當不同會話讀取聚簇主鍵索引記錄時 InnoDB會把記錄的事務ID和該會話的讀取視圖比較 如果更改他的事務未提交 則跟蹤undo log直到一個符合可見條件的事務ID
大多數讀取通過這種方式不需要獲取鎖(通過讀取快照) 缺點是存儲引擎會對每一行存儲更多數據 做更多工作
MVCC僅適用于REPEATABLE READ和READ COMMITTED隔離級別.(可以想象對于可重復讀 讀取的事務id固定為事務進行中第一次讀的可見事務id 對于讀已提交 讀最新的可見事務id另外兩個因為不需要事務版本(一個是臟讀 一個是串行化的) 和MVCC不是很適配(當然要看不同引擎的實現)
復制Replication一主多從
數據文件結構在8.0版本中,MySQL將表的元數據重新設計為一種數據字典,包含在表的.ibd文件中使得表結構上的信息支持事務和原子級數據定義更改
除了以來information_schema檢索表定義和元數據引入了字典對象緩存 LRU的內存緩存使得服務器訪問表的元數據減少了I/O每個表的.ibd和.frm文件被替換為已經被序列化的字典信息(.sdi).
InnoDB引擎為處理大量短期事務而設計 這些事務預期通常是正常提交 很少會被回滾
默認情況下,InnoDB將數據存儲在一系列的數據文件中,這些文件統被稱為表空間(tablespace)
InnoDB使用MVCC來實現高并發性,并實現了所有4個SQL標準隔離級別.默認為REPEATABLE READ隔離級別,并且通過間隙鎖(next-key locking)策略來防止在這個隔離級別上的幻讀:InnoDB不只鎖定在查詢中涉及的行,還會對索引結構中的間隙進行鎖定,以防止幻行被插入
基于聚簇索引構建但是,因為二級索引(secondary index,非主鍵索引)需要包含主鍵列,如果主鍵較大,則其他索引也會很大.如果表中的索引較多,主鍵應當盡量小.
微信讀書: https://weread.qq.com/web/bookDetail/00a32b70813ab746fg018ec7博客位置: https://bingowith.me/2022/11/08/high-performance-mysql-4th-ch01-note/

推薦閱讀