innodb存储引擎

文章目录

  • innodb引擎特点:
  • innodb体系架构
    • 后台线程
    • 内存
      • 缓存池
      • LRU List ,Free List和Flush List
        • LRU List
        • Free List:
        • Flush List

innodb引擎特点:

支持事务(myisam无)
支持行锁,表锁(myisam只支持表锁)
支持外键(myisam无)
通过对版本并发控制(mvcc)来获得高并发性
插入缓存(insert buffer)
二次写(double write)
自适应哈希索引
聚集索引

innodb引擎在mysql数据库5.5.8版本开始,是默认的存储引擎

innodb体系架构

innodb存储引擎_第1张图片

后台线程

主要作用就是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。
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区(5/8之下),再次被访问到,会做如下判断
如果这个数据页在LRU链表中old区存在的时间超过了1秒,就把它移动到young区(5/8之上)
这个存在时间由innodb_old_blocks_time控制

Free List:

数据库刚启动时内存中还没有读入任何页,此时这些页由FreeList管理,
当需要从缓冲池中分页时,首先从freelist中查找是否有可用的空闲页,若freelist没有能使用的freebuffer,则会把lru末尾的数据释放,若有则直接使用freelist中的页。

Flush List

在LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页的数据产生了不一致。这时数据库会通过CHECKPOINT机制将脏页刷新回磁盘,而Flush列表中的页即为脏页列表。需要注意的是,脏页既存在于LRU列表中,也存在于Flush列表中。LRU列表用来管理缓冲池中页的可用性,Flush列表用来管理将页刷新回磁盘,二者互不影响。

你可能感兴趣的:(mysql)