MySQL以及INNODB一些核心概念

MySQL核心技术(Checkpoint技术、InsertBuffer技术、DoubleWrite技术)
Checkpoint技术
Checkpoint(检查点)解决的问题:
1.缩短数据库的恢复时间;
2.缓冲池不够用时,将脏页刷新到磁盘;
3.重做日志不可用时,刷新脏页。
MySQL 循环写入redo日志文件,日志文件中的数据是影响记录的编码。日志文件中的记录使用LSN来标识,LSN单增。
ORACLE通过SCN来标识。
checkpoint是写入磁盘和未写入磁盘的分界点,checkpoint是通过LSN来判定的。
当数据库宕机对于还未写入磁盘的修改数据可以通过redo log恢复。Checkpoint作用在于保证该点之前的所有修改的页均已刷新到磁盘,这之前的redo log在恢复数据时可以不需要了。
Checkpoint分类
Sharp Checkpoint
发生在数据库关闭时,将所有脏页写入磁盘,默认设置。(innodb_fast_shutdown=1)
Fuzzy Checkpoint
只刷新部分部分脏页。
1、Master Thread Checkpoint:Master Thread刷新一定比例脏页。
2、Flush_LRU_LIST Checkpoint:为了保证LRU中有一定数量的空闲页,Page Clear Thread将对LRU中尾端页进行移除,如果存在脏页则做刷新。
3、Async/Sync Flush Checkpoint:为了保证redo log循环使用(覆盖),对于需要将redo文件中不可用的脏页进行刷新到磁盘。(同步、异步)
4、Dirty Page too much Checkpoint:脏页数量太多。

InsertBuffer技术
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引
当插入数据需要更新非聚集索引时,如果每次都更新则需要进行多次随机IO,因此将这些值写入缓冲对相同页进行合并提高IO性能。
插入非聚集索引时,先判断该索引页是否在缓冲池中,在则直接插入。否则写入到Insert Buffer对象。

DoubleWrite(双写)技术
double write的实现分两个部分,一个是缓冲池中2M的内存块大小,一个是共享表空间中连续的128个页,大小是2M。
1、将脏页拷贝到double write buffer中,然后再分两次,每次1M(内存中)
2、将double write buffer 刷新到磁盘ibdata1共享表空间中的double write 区
3、将double write buffer 刷新到磁盘的各个表空间(此时如果发生宕机等问题,可以从doublewrite中读取到数据

INNODB核心概念
Innodb存储引擎主要包括内存池以及后台线程
内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据、缓存磁盘数据,修改文件前先修改内存、重做日志缓冲
后台线程:刷新内存池中的数据,刷新脏数据,保证在数据库发生异常的情况下InnoDB能恢复到正常状态

线程
Master Thread
负责将缓存池中的数据同步刷新到磁盘,包括脏页。合并插入缓存(INSERT BUFFER)、UNDO页的回收等。
IO Thread
Innodb中大量使用IO处理写请求,IO Thread则主要处理这些请求的回调,包括write、read、insert buffer和log
Purge Thread
主要用来回收undo页
Page Cleaner Thread
刷新脏数据

内存
缓存池 buffer_pool(innodb_buffer_pool_size)
Innodb的数据以页的形式存储在磁盘,因此采用内存作为缓存页数据。
读页数据时,先将磁盘上的页数据“FIX”到缓冲池,下次读即可直接从缓冲池中读。
修改数据时,先修改缓冲池中的页数据,然后刷新到磁盘,并不是每次都刷新而是通过Checkpoint机制刷新到磁盘。
数据页类型:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引、锁信息、数据字典信息等
缓存池通过LRU算法管理(MID POINT技术)
普通LRU:最频繁的处于列表前端,最少使用处于尾端,先释放列表尾端的页
Innodb LRU:在LRU队列中加入midpoint位置,默认值5/8,表示新读取的页加入到列表的5/8位置

日志缓冲 redo_log_buffer
缓存重做日志
redo日志在磁盘上是两个文件:ib_logfile0和ib_logfile1。
innodb_log_file_size:定义每一个重做日志文件的大小。默认的重做日志文件大小为48M,所有日志文件的总大小不能超过512G
innodb_log_files_in_group:日志文件的个数,默认为2个
innodb_log_group_home_dir:日志文件的存放目录,默认为datadir

undo
1、反复读
ORACLE 提交读,MYSQL 反复读
每个事务第一次读,读的时候如果是脏块就去UNDO读,如果提交了就去内存读。并且以后都会读到相同的内容,不会发生改变。
2、MVCC多版本读取,把修改前的数据存放于undo log
3、回滚用 。只要没COMMIT,实例恢复时候去UNDO找数据
4、放在UNDO段,在共享表空间里,最多128*1024个事务
5、以链表的方式存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值