## 體系結構
InnoDB的體系結構:
:-: 
后臺線程可以分為:
* Master Thread:負責將緩沖池的數據異步刷新到磁盤,保證數據一致性。
* IO Thread:使用AIO來處理IO請求,一般情況下有4個讀線程和4個寫線程。
:-: 
* Purge Thread:回收已經使用并分配的undo頁。
* page Cleaner Thread:刷新之前版本中的臟頁數據。
**緩沖區**
InnoDB的內存結構可以分為如下幾個部分:
* 緩沖池:多存放表和索引數據。
* 更改緩沖區:保存insert、delete、update等更改操作的緩沖區。
* 自適應哈希索引:存放在程序運行中生成的自適應哈希索引結構。
* 日志緩沖區:日志緩沖區的內容會定期刷新到磁盤。
InnoDB存儲引擎內存池的緩沖區可以起到和cache類似的作用。查看當前系統InnoDB緩沖區的大小:
:-: 
默認為128M
緩沖池中緩存的數據頁類型有:索引頁、數據頁、undo頁、插入緩沖(insert buffer)、自適應哈希索引(adaptive hash index)、InnoDB存儲的鎖信息(lock info)、數據字典信息(data dictionary)。其內部結構如下:
:-: 
查看緩沖池的數量(會將每個頁根據哈希值平均分配到不同的緩沖池實例中)
:-: 
**如何管理內存**
InnoDB使用LRU算法來進行內存緩存頁的管理。在InnoDB存儲引擎中,緩沖池頁的大小默認為16KB,與普通的LRU算法不同的是,LRU列表還加入Midpoint位置。對于讀取到新的頁,不再是直接放到最前面的位置,而是放在midpoint的位置,這個位置在LRU列表長度的5/8處。InnoDB將midpoint之前的列表稱為new(活躍的)列表,將midpoint之后的列表稱為old列表。
:-: 
\[old列表占尾端37%\]
LRU列表用來管理已經從磁盤讀取到的頁,但是數據庫剛啟動的時候,LRU列表是空的,沒有任何的頁。這時頁都存放在Free列表中。
同時innodb可能會對每個頁的內容進行壓縮,對于非16KB大小的頁,是通過unzip\_LRU列表進行管理的;每個頁可能被壓縮成2KB、4KB、8KB大小。unzip\_LRU是對不同的尺寸的頁進行管理的,同時利用**伙伴系統**進行內存大小的分配。例如當需要對內存申請4KB大小的頁時,會進行如下操作:
* 查看4KB列表是否有足夠的空間,有直接分配。
* 否則查看8KB列表是否有足夠的空間,有將8KB大小的空閑頁劃分為2個4KB大小的頁,放入4KB大小的unzip\_LRU列表中。
* 如果8KB大小列表沒有足夠空間,則從16KB中的LRU申請空閑頁,劃分成一個8KB和2個4KB的頁放入對應的unzip\_LRU列表中
臟頁:在LRU列表中的頁被修改之后,該頁就會被稱為臟頁,這個時候緩沖池中的頁和磁盤中的頁數據不一致。數據庫會通過checkpoint機制將臟頁刷回到磁盤中,而Flush列表頁即為臟頁列表。`臟頁會同時保留在LRU列表和Flush列表。`因此Flush列表用來負責將臟頁刷回到磁盤中。
使用`show engine innodb status\G;`可以查看各個列表中的大小
:-: 
**redo log緩沖**
InnoDB會將重做日志信息放到redo log buffer中,并且按照一定的頻率刷入磁盤中,刷入磁盤的時機為:
1. Master Thread每秒將redo log buffer刷新到redo log file中。
2. 每個事務提交時會將redo log buffer刷新到redo log file中。
3. 當redo log buffer緩沖區小于1/2的時候,會將redo log buffer刷新到redo log file中。
查看redo log buffer大小
~~~
?show variables like 'innodb_log_buffer_size'\G;
~~~
## checkpoint
checkpoint(檢查點)技術是為了解決如下幾個問題:
1. 縮短數據庫進行重做日志時的恢復時間。
2. 緩沖池不夠用時,將臟頁刷新到磁盤,一次刷新多少?
3. 重做日志不可用時,刷新臟頁。
checkpoint技術要做的事情就是將緩沖池中的臟頁刷回到磁盤,每次刷新多少頁,每次從哪里取臟頁(LRU列表、Flush列表),以及什么時間觸發Checkpoint。
觸發Checkpoint的時間點:
1、 Sharp Checkpoint:數據庫關閉的時候將所有臟頁刷新到磁盤中。
2、Fuzzy Checkpoint:一次刷新一部分的臟頁,而不是將所有的臟頁進行刷新。
* Master Thread Checkpoint:Master Thread線程每秒或者每十秒異步的刷新一定比例的臟頁回盤。
* FLUSH\_LRU\_LIST Checkpoint: 當LRU中的可用頁不夠的時候,需要將LRU列表中尾端的一些臟頁刷新回磁盤。在新的版本中使用Page Cleaner線程來檢查LRU列表是否有足夠的可用頁。
* Async/Sync Flush Checkpoint:重做日志不可用的時候刷新。
* Dirty Page too much Checkpoint:當臟頁數量超過一定比例的時候Innodb引擎就會強制進行Checkpoint,保證緩沖池中有足夠的可用頁。這個比例可以通過`show variables like 'innodb_max_dirty_pages_pct'\G`查看。
:-: 
【超過90%時候進行刷新】
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper