innodb引擎特点:
支持事务(myisam无) 支持行锁,表锁(myisam只支持表锁) 支持外键(myisam无) 通过对版本并发控制(mvcc)来获得高并发性 插入缓存(insert buffer) 二次写(double write) 自适应哈希索引 聚集索引
innodb引擎在mysql数据库5.5.8版本开始,是默认的存储引擎
innodb体系架构
后台线程
主要作用就是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。 1.master thread 他是一个核心的后要线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。 2.IO Thread 使用大量的AIO来处理写IO请求,这样可以极大提高数据库的性能 3.purge thread 事务被提交后,时期锁使用的undo 可能不再需要,因此需要pruge thread来回收已经使用并分配的undo页,innodb1.2版本后支持多个purge thread 4.page cleaner thread 将之前的版本中脏页的刷新操作放到单独的线程中完成,减轻master thread 工作量
内存
缓存池
缓存池中的数据页类型有索引页,数据页,undo页,插入缓存,自适应哈希索引等,记录是按照页得方式进行管理的
LRU List ,Free List和Flush List
LRU List
LRU算法: 新数据放到链表头部。 每当缓存命中(缓存数据被访问),则将其数据移到链表头部。 当链表慢的时候,将链表尾部数据丢开
在innodb中,新访问的页并不是直接放到LRU列表的头部,而是放到midpoint位置,在列表长度多的5/8处(大约63%)。 为什么要改成这样呢? 为了防止某些SQL操作可能会使缓冲池中的页被刷新移出,从而影响缓冲池的效率 当这个数据页在old区,再次被访问到,会做如下判断 如果这个数据页在LRU链表中old区存在的时间超过了1秒,就把它移动到young区 这个存在时间由innodb_old_blocks_time控制
Free List:
数据库刚启动时内存中还没有读入任何页,此时这些页由FreeList管理, 当需要从缓冲池中分页时,首先从freelist中查找是否有可用的空闲页,若freelist没有能使用的freebuffer,则会把lru末尾的数据释放,若有则直接使用freelist中的页。
Flush List
在LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页的数据产生了不一致。这时数据库会通过CHECKPOINT机制将脏页刷新回磁盘,而Flush列表中的页即为脏页列表。需要注意的是,脏页既存在于LRU列表中,也存在于Flush列表中。LRU列表用来管理缓冲池中页的可用性,Flush列表用来管理将页刷新回磁盘,二者互不影响。
|