InnoDB
通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎
OLTP应用:On-Line Transaction Processing联机事务处理过程(OLTP),也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一。
2.1InnoDB存储引擎概述
该存储引擎是第一个完整支持ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效的利用以及使用内存和cpu
2.2InnoDB存储引擎版本
MySQL5.1:允许存储引擎以动态方式加载引擎;两个引擎,静态引擎,动态加载引擎(InnoDBPlugin)InnoDB1.0.x,增加compress和dynamic页格式
MySQL5.5:支持InnoDB1.1.x,增加了Linux AIO\多回滚段
MySQL5.6:InnoDB1.2.x,增加了全文索引支持,在线索引添加
2.3InnoDB体系架构
- 后台线程
- 内存池
- 磁盘文件
2.3.1后台线程
Master Thread
主要负责讲缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSET BUFFER)、UNDO页的回收等IO Thread
主要负责IO请求的回调处理。
InnoDB1.0之前共有四个IOThread,分别是write\read\insert buffer\log io thread
从InnoDB1.0.x,read和write thread分别增大到了4个。分别可以使用innodb_read_io_threads和innodb_write_io_threads来调整数目
可以通过SHOW ENGINE INNODB STATUS\G来观察io ThreadPurge Thread
事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经被分配使用的undo页
用户可以在MySQL的数据库配置文件中添加如下命令来启动独立的PurgeThread:
[mysqld]
innodb_purge_thread=1
- Page Cleaner Thread
innoDB1.2.x引入,作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。其目的是为了减轻原Master Thread 对于用户查询线程的租在,进一步提高InnoDB存储引擎的性能
2.3.2 内存
1. 缓冲池
缓冲池的默认页面大小为16k
缓冲池的配置通过innodb_buffer_pool_size来设置
查看:SHOW VARIABLES LIKE 'innodb_buffer_pool_size'\G;
缓冲池中的数据页类型有:索引页、数据页、undo页、插入缓冲页、自适应哈希索引、InnoDB存储的锁信息、数据字典索引等
从1.0.x允许有多个缓冲池实例,该属性可以通过innodb_buffer_pool_instances来配置,默认值为1
2. LRU List、Free List 和Flash List
LRU优化算法midpoint insertion strategy,midpoint可以通过innodb_old_blocks_pct来配置(表示到尾端的百分比):默认配置下将最近读到的页放入lru列表长度的5/8处。
midpoint之前的成为new列表,之后的称为old列表
innodb_old_blocks_time:用于表示列表读取到mid位置后需要等待多久会被加入到LRU的热端
LRU用来管理已经读取的页,最初为空,所有的页都放在Free List中
LRUold部分的页加入new端的操作被称为page made young,而因为innodb_old_blocks_time的设置没有加入new成功的操作被称为page not made young
可以通过SHOW ENGINE INNODB STATUS 来查看LRU 和 free 列表的状态
一个重要的检测变量 Buffer pool hit rate 如果小于95%,用户需要观察是否由于全表扫描引起的LRU列表被污染的问题
从1.2版本开始可以使用表INNODB_BUFFER_POOL_STATUS来观察缓冲池的运行状态
SELECT POOL_ID,HIT_RATE,PAGES_MADE_YOUNG,PAGES_NOT_MAGE_YOUNG FROM INNODB_BUFFER_POOL_STATUS\G;
可以通过表INNODB_BUFFER_PAGE_LRU来观察每个LRU列表中每个页的具体信息
SELECT TABLE_NAME,SPACE,PAGE_NUMBER,PAGE_TYPE FROM INNODB_BUFFER_PAGE_LRU WHERE SPACE=1;
Innodb从1.0.x开始支持压缩页功能,将原来的16k变为1k\2k\4k\8k,非16K的页通过unzip_LRU列表进行管理
可以通过information_schema架构下的表INNODB_BUFFER_PAGE_LRU来观察unzip_LRU中的页
SELECT TABLE_NAME,SPACE,PAGE_NUMBER,COMPRESSED_SIZE FROM INNODB_BUFFER_PAGE_LRU WHERE COMPRESSED_SIZE<>0;
flush 列表即需要刷新回磁盘的脏页,可以通过两种方式来查看:
a. SHOW ENGINE INNODB STATUS查看Modified db pages
b. 通过INNODB_BUFFER_PAGE_LRU
SELECT TABLE_NAME,SPACE,PAGE_NUMBER,PAGE_TYPE FROM INNODB_BUFFER_PAGE_LRU WHERE OLDEST_MODIFICATION>0;