连接池组件、管理服务和工具组件、SQL接口组件、查询分析器组件、优化器组件、缓冲组件、插件式存储引擎、物理文件;
存储引擎是基于表的,而不是数据库
InnoDB、MyISAM、NDB、Memory、Archive、其他
支持事务,支持行锁、支持外键,支持非锁定读;设计的目的主要面向在线事务处理的应用(OLTP)
数据放在逻辑表空间中,自行管理,通过使用多版本并发工具(MVCC)来获得高并发性,并且实现了SQL标准的四种隔离级别,默认可重复读,同时它使用了一种next-key-locking策略来避免幻读。InnoDB中的数据是以聚集的方式存储,每张表只有一个主键,如果没有主键,那InnoDB会给每行数据创建一个6字节的ROWID来作为主键。
后台线程:InnoDB存储引擎是多线程模型,不同的线程处理不同的事情,分别是:
Master Thread:主要负责把缓冲池中的数据异步刷新到磁盘中,保证数据的一致性,包括刷新脏页,合并插入缓冲
IO Thread:InnoDB中使用了大量的AIO来处理IO请求,提高数据库的性能,而IO Thread主要作用是负责这些IO请求的回调处理;IO Thread有四种,分别是write、read、insert buffer、log io thread,Windows下可以设置线程数量,Linux不能设置
Purge Thread:事务提交之后,所使用的undolog不在需要,因此purge thread主要用来回收undo页
Page Cleaner Thread:脏页的刷新,减少master thread的压力;
内存:缓冲池、(LRU list、Free list、Flush list)、重做日志缓冲、额外的内存池
缓冲池:缓冲池其实就是一块内存区域,由于CPU速度和磁盘速度上的一个鸿沟,基于磁盘的数据库系统通常采用缓冲池技术来提升数据库的整体性能;对数据库中的页进行操作时,先将页读到缓冲池,下次再读取相同的页时,直接在缓冲池中就能获取,如果没有,则从磁盘读取。当对某个页进行操作时,首先修改缓冲池中的页,完了之后再以一定的频率刷新到磁盘;不是每次操作完就刷新,而是采用checkpoint技术刷新,为了提升整体性能;
插入缓冲(Insert Buffer)
聚集索引的插入式按照主键的顺序插入,一般是自增的,不要随机的访问磁盘,所以插入性能很高;而辅助索引的插入有可能不是顺序的,这就需要离散的访问非聚集索引页,最终由于随机读取而导致插入性能下降;
Insert Buffer对于非聚集索引的插入和修改操作,不是每次直接插入到索引页,而是先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,如果不在,则把它放入到一个Insert Buffer中;实际上还没插入到页子节点上,只是保存在另一个地方,然后以一定的频率和情况进行Insert Buffer和辅助索引的页子节点merge操作,这时其实是把多个插入合并成一个,大大提升非聚集索引插入的性能。Insert Buffer必须满足的条件:必须是辅助索引,必须不是唯一索引。
两次写(Double Write)
假如InnoDB正在写入某个页,这时正好发生了宕机,而写的这个页只写了一部分,这种情况称为部分写失效;如果要恢复数据,有人说可以通过重做日志来恢复,实际上重做日志记录的是对页的物理操作,由于页已经损坏,在通过重做日志恢复数据没有意义;Double Write意思是,在应用重做日志之前,用户需要一个页的副本,当发生写入失效时,先通过页的副本还原该页,再进行重做日志,这就是Double Write;Double Write带给InnoDB的是数据的可靠性;
自适应哈希索引(AHI)
哈希是一种非常快的查询方式,时间复杂度O(1),B+Tree的查询次数取决于树的高度,生产上一般是3~4层,也就是最多查询3~4次;InnoDB会监控表的使用情况,如果观察到建立哈希索引能带来性能上的提升,则会创建自适应哈希索引,不需要人为的干预。AHI的要求,对每个页的连续访问模式是一样的,即:(a,b) WHERE a=x;WHERE a=x and b=xx
异步IO(Aysnc IO)
为了提高对磁盘的操作性能,当前的数据库都采用异步IO (AIO)来处理磁盘操作;AIO的另一个优势是可以合并多个IO,提高数据库整体IOPS的性能。
刷新临近页
原理是当刷新一个脏页的时候,InnoDB存储引擎会检测该页所在区的所有页,如果有脏页,则一起刷新;
信息加载中,请等待
微信客服(速回)
微信客服(慢回)