標簽:並且 單位 緩沖池 控制 數據庫 默認值 ODB https 用戶
1、InnoDB的磁盤結構
1)系統表空間
2)用戶表空间
3)rodolog 文件组
4)磁盤文件邏輯結構
文件->段->區->頁->行
InnoDB对数据的存取是以页为單位的,一个数据页默认是16k
2、InnoDB的內存結構
1)buffer pool
1.數據頁
2.索引頁
3.ChangeBuffer修改緩沖區(InsertBuffer插入緩沖區)
爲了提高輔助索引(非聚集索引,除主鍵之外的索引)更新性能,暫時先把輔助索引的更新內容寫到ChangeBuffer中。後台有線程定時更新。
4.自適應hash索引
为了提高查询性能,由InnoDB自己维护了一个hash索引。用戶无法干预。
參考:https://juejin.im/post/6847902217270198286
5.鎖信息和數據字典
2)redo log buffer重做日志缓冲区
1.redolog是一个顺序写的日志文件。wal(write ahead log)模式。顺序写比随机写效率要高。使用redo log暂存提交成功的数据。如果一旦系统崩溃,可以使用redo log恢复数据。
2.redo log buffer就是一个缓冲区,定时将缓冲区的数据保存到磁盘。
默认1s保存一次。默认在执行commit操作之前刷新redo log buffer。
参数:innodb_flush_log_at_trx_commit控制redo log的落盘时机
* 当属性值为0时,事务提交时,不会对重做日志进行写入操作,而是等待主线程按时写入每秒写入一次;
* 当属性值为1时,事务提交时,会将重做日志写入文件系统缓存,並且调用文件系统的fsync,将文件系统缓冲中的数据真正写入磁盘存储,确保不会出现数据丢失;
* 当属性值为2时,事务提交时,也会将日志文件写入文件系统缓存,但是不会调用fsync,而是让文件系统自己去判断何时将缓存写入磁盘。
3)双写缓冲区
数据落盘需要执行双写操作,需要使用到双写缓冲区。稍后详解。
3、數據落盤
1)髒頁
当更新数据commit之后,数据不是马上更新到磁盘。把数据更新到緩沖池中对应的数据页和索引页中。此时就会造成内存中的数据页和索引页与磁盘上的数据页不一致,就形成了脏页。
2)CheckPoint
執行髒頁落盤操作的。
sharp checkpoint:在关闭數據庫的时候,将buffer pool中的脏页全部刷新到磁盘中
fuzzy checkpoint:模糊落盘
1、Master Thread Checkpoint;
會以每秒或者每10秒一次的頻率,將部分髒頁從內存中刷新到磁盤,參數可調。
2、FLUSH_LRU_LIST Checkpoint;
使用LRU算法需要把一些數據頁移除,但是數據頁是髒頁,需要執行checkpoint。
3、Async/Sync Flush Checkpoint;
redo log文件快写满时。
Async:当需要落盘的日志超过日志文件的75%並且小于90%时。
sync:當需要落盤的日志超過日志文件超過90%時。
4、Dirty Page too much Checkpoint
bufferPool緩沖池脏页太多
Dirty Page 由[innodb_max_dirty_pages_pct]配置,innodb_max_dirty_pages_pct的默認值在innodb 1.0之前是90%,之后是75%
3)双写落盘double write
當髒頁落盤過程中,是使用雙寫操作執行落盤的。
1.把要落盤的數據寫先寫入雙寫緩沖區2m大小的雙寫緩沖區。
2.把雙寫緩沖區的數據寫入系統表空間中的雙寫區。
3.把双写缓冲区的数据写入用戶表空间中。
redolog中记录的是数据页中修改了哪些内容,并不是完整的数据页。
场景1:系统表空间中的数据页写坏了,可以通过用戶表空间的数据页+redolog恢复。
场景2:系统表空间中的数据页写完了,用戶表空间写坏了。可以通过系统表空间的数据页恢复。
通过双写机制保证数据落盘过程万无一失。
標簽:並且 單位 緩沖池 控制 數據庫 默認值 ODB https 用戶
原文地址:https://www.cnblogs.com/lvjingying/p/14016627.html