分布式存储中指明了存储的下层就是存储引擎,所以就拿一个实际的存储引擎进行学习了解,存储引擎究竟是如何操作使用的。下面对InnoDB存储引擎做一个简单的总结。
1、什么是InnoDB存储引擎,在此存储引擎上支撑的什么样的数据库
InnoDB目前支持上层的数据库为MySQL,目前支持MySQL的相关特性由:ACID的事务,行锁,MVCC版本控制,外键,非锁定读
2、关于Innodb的源码中基本结构
innode默认有一个内存池和持久化的磁盘,其中内存池中运行有7个线程,其中有4个IO线程,有一个主线程,一个锁线程,还有一个错误监控线程
3、innode内存的缓冲区中缓存的数据有:
数据页
索引页
插入换成区
自适应哈希索引
锁信息
数据字典信息
4、master主线程的主要操作
每秒钟进行刷新操作:
总是将日志刷新到磁盘上
可能合并插入缓冲,取决于一秒内IO的次数
最多刷新100个脏页到磁盘上
没有用户活动,自动切换到后台操作
每10s进行的刷新操作
刷新100个脏页到磁盘上
合并至多5个插入缓冲
将日志刷新到磁盘上
产生一个检查点等
5、innode为了考虑缓冲区和磁盘IO的平衡,使用的不是之前了解的单纯的LRU算法,使用下面的方法:
将内存中修改的页称为脏页,待刷新到磁盘上
插入的新页不是直接插入到LRU缓冲区中,专门设置了一个插入缓冲区,新页插入到插入缓冲区中
即不是像传统的一样未命中替换末尾冷的数据页,而是可以将多个脏页刷新到磁盘上,内存缓冲区剩余空也,可以直接被插入,通过这种方法来维护缓存的。
6、聚集索引和非聚集索引的区别
聚集索引:
物理存放的顺序和索引存放的数据一致,即索引的前后对应的数据位置的前后
打个比方:汉语字典中的拼音索引,汉字正文也是按照拼音进行排序的
非聚集索引:
物理存放的顺序与索引存放的数据是不一致的
打个比方:汉语字典中的偏旁部首,偏旁部首的相邻的数据索引,正文实际位置并不相邻
7、聚集索引和非聚集索引插入时候的区别
对于聚集索引:物理位置插入后,直接在索引+1后面插入即可
对于非聚集索引,插入后,还需要首先通过聚集索引找到新插入的页,然后计算非聚集索引,然后离散的访问下一个非聚集索引。
8、innod中对于非聚集索引的优化
针对非聚集索引这种离散化的读操作,innod对这种进行了优化
优化方式:
使用插入缓冲区,innodb在内存中开辟了一个区域叫做插入缓冲区,这个缓冲区是用来处理插入非聚集索引的。
主要执行以下操作:
插入的非聚集索引是否命中,命中则直接返回
未命中,则加入到插入缓冲区
在缓冲区进行合并操作,将多个非聚集缩影操作合并称为一个操作,即操作一个索引页,通过这种方法减少非聚集索引离散度的影响、
9、innodb两次写入方法赖保证数据的可靠性
innodb 写入时采用两次写的思想,并不是直接把数据脏页刷新到磁盘上,而是先后两个将数据顺序的写入到磁盘的书共享表空间,在从磁盘的共享表空间同步到磁盘的物理区域上。
10、innodb中自适应哈希索引的技术
用于哈希索引查询的速度非常快,但是哈希的过程建立是耗时的,所以innodb中提出了自适应哈希索引
首先,innodb对索引的查找进行监控,如果用户对某些数据的索引访问非常频繁,则会自动为这些数据使用哈希索引,建立索引表,这样下次访问这些频繁的数据即可使用哈希索引。
但是哈希索引仅仅用于SQL进行等值查询,返回查询是不行的、
11、innodb的文件
除了上述讲了以下关于innode的操作知识,innode对外存放有效的数据是表空间的形式存放的
每个以innodb引擎的表都会产生一个表空间,该文件存放表的索引和插入缓冲的一些信息
除了表空间文件外,还有一个重做日志文件,用来恢复事务日志。