1,引言
1.1
区分数据库和数据库实例
数据库是文件的集合,是数据集合,而数据库实例是管理软件,我们操作数据库,即进行增删改查都是通过数据库实例进行的
1.2 mysql的存储引擎
mysql的核心就是存储引擎
存储引擎分为官方存储引擎和第三方存储引擎.有的第三方存储引擎非常强大,入Innodb
1.2.1 Innodb
Innodb支持事务,设计目标就是在线事务处理(OLTP).行锁设计,支持外键,从5.5.8开始Innodb就是默认的存储引擎,将数据放在一个逻辑的表空间中.
Innodb使用多版本并发控制(MVCC)来获取高并发性,并实现了SQL标准的四种隔离级别,默认是REPEATABLE.同时使用一种next-key-Locking来避免幻读现象的产生,还有许多高级特性,稍后介绍
1.2.2 MyISAM
不支持事务,表锁设计,支持全文检索,面向OLAP数据库应用
2 Innodb概述
第一个完整的支持ACID的存储引擎,MVCC,行锁设计,支持外键,提供一致性非锁定读
2.1 Innodb的体系结构
Innodb由多个内存块组成,这多个内存块可看做是一个内存池
2.1.1后台进程
(1),Master Thread
负责内存池的数据异步刷新到磁盘,保证数据的一致性
(2),IO Thread
存储引擎中使用了大量的AIO来处理IO请求,可以极大的提高数据库的性能.
show variables like 'innodb_%io_threads';
查看读写线程,各4个(读/写)
(3),Purge Thread
加快undo页的回收,原本是Master Thread实现的功能,后来单另出来,分担压力
show variables like 'innodb_purge_threads'
四个purge Thread
2.1.2内存
(1),缓冲池
Innodb的数据都是存在磁盘上的,以页的方式,所以是基于磁盘的数据库系统,但是由于CPU(处理器)和磁盘速度的鸿沟,Innodb会通过缓冲池进行提供性能
注意:当在缓冲池中修改页的时候,并不是已修改就要写回磁盘,而是通过CheckPoint的技术来提高性能
缓冲池中数据页类型如下图所示:
在后来的版本中,允许有多个缓冲池的实例,每一个页根据哈希值分配到不同的缓冲池中
同时也可以查看表的信息
use information_schema;
select pool_id,pool_size,free_buffers,database_pages from innodb_buffer_pool_stats;
(1.2)缓冲池的管理方式
LRU list(最近最少使用),频繁使用的放在前面,不经常使用的放在后面,当不能存放新读取到的页时,会首先释放尾端的页,同时Innodb对传统的URL算法进行了优化,在Innodb中加入了midpoint位置,当你读到一个新的页,不会放入到队列的最开头,而是将其放在LRU list的midpoint位置
mysql> show variables like 'innodb_old_blocks_pct';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_old_blocks_pct | 37 |
+-----------------------+-------+
1 row in set (0.01 sec)
midpoint的位置大概就是37的位置(距离尾端3/8)的位置,以这个midpoint为分界点,之前的为热点区,之后的为老区,时刻有可能被划分出去
至于为什么不采用传统的URL算法,是因为如果最新的页直接放到首部,那么某些SQL操作可能就会是缓冲池的页被刷出.
具体举个例子来说:扫描操作,将大量的页放入队列,有可能使得原来热点区的页从LRU的列表中移除
现在介绍了URL list,然后我们介绍Free list.URL用来存储已经读的页,页都放在内存的Free list 中.
将old区的页到了new区的页的过程称为page made young,而由于Innodb_block_time(现在放在了mid区域,经过多久才能放在new区)没有放入new区等待的过程page not made young.
Innodb现在也支持压缩页的功能,原本的页需要16kb现在压缩到了1kb,2kb,4kb,8kb,这个时候对于非16kb的页进行管理的时候,通过unzip_LRU列表进行管理.兄弟算法
Flush list存放脏页(在LRU队列中被修改的列,造成了缓存和磁盘数据不一致),这里要使用checkpoint方式将脏页写回到磁盘.
Checkpoint技术
当对缓冲池中执行一条DML语句,是的缓冲池的内容比磁盘的新,这个时候缓冲池的页被称为"脏页",然后这个时候需要讲缓冲池的内容写回到磁盘中.
Checkpoint技术
缩短数据库中的恢复时间
缓冲池不够用的时候,将脏页写回到磁盘
重做日志不可用的时候,刷新脏页.
Sharp Checkpoint在数据关闭时将脏页全部写回到磁盘
Fuzzy Checkpoint,在运行时,只刷新一部分脏页,而不是刷新全部的脏页
- master Thread CheckPoint 每秒或者每十秒将脏页列表刷新回到磁盘中去,异步.
- FLUSH_LRU_LIST Checkpoint 需要保证的LRU列表中有100个空闲页可用,在1.1x版本之前,会查看有多少空闲页,如果空闲页不够就会把LRU的尾端的页移除,如果这些页中有脏页就写回磁盘,从1.2x开始,就是单独的线程不会阻塞运行,
- Async/Sync Flush Checkpoint 指的是重做日志不可用的情况下,强制将一些页刷新回磁盘.
- Dirty Page too much 脏页太多的话,就会写一部分到磁盘
master Thread
Master Thread 其中包括多个线程,Loop为主循环,分为每一秒的操作和每十秒的操作.
每一秒的操作包括:
日志缓冲刷新到磁盘,即使事务还没有提交.
合并插入缓冲
刷新脏页到磁盘中
如果没有活动,就切换到background loop
每十秒的操作包括: