数码资讯
InnoDB的体系结构和功能的详细(InnoDB存储引擎的读书笔记总结)
后台线程 主线程 核心后台线程负责异步刷新缓冲池的数据到磁盘。例如,刷新脏页、插入缓冲区的合并、撤消页的恢复等。 每秒一次操作: 1。日志缓冲区被刷新到磁盘,即使事务尚未提交,操作总是会发生,这是为较大事务提交的短时间。 2。当IO压力很小(IO数发生在1s内小于5% innodb_io_capac
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
后台线程
主线程
核心后台线程负责异步刷新缓冲池的数据到磁盘。例如,刷新脏页、插入缓冲区的合并、撤消页的恢复等。
每秒一次操作:
1。日志缓冲区被刷新到磁盘,即使事务尚未提交,操作总是会发生,这是为较大事务提交的短时间。
2。当IO压力很小(IO数发生在1s内小于5% innodb_io_capacity),5% innodb_io_capacity插入缓冲相结合。
三.当脏页率大于innodb_max_dirty_pages_cnt,在innodb_io_capacity缓冲池的脏页刷新到磁盘。否则,如果innodb_adaptive_flush打开,更新的脏页数量将根据buf_flush_get_desired_flush_rate刷新。
每10秒操作一次:
1。如果在10 IO操作比过去innodb_io_capacity,在innodb_io_capacity缓冲池的脏页刷新到磁盘。
2。合并5% innodb_io_capacity插入缓冲器。
三.将日志缓冲区刷新到磁盘。
4。删除无用的撤消页。
5。如果缓冲池中的脏页的比例超过70%,刷新innodb_io_capacity脏页再到磁盘。否则,10% innodb_io_capacity脏页刷新。
后台循环(当数据库空闲或数据库关闭时):
1。删除无用的撤消页。
2。合并innodb_io_capacity插入缓冲器。
刷新循环(数据库空闲):
1。innodb_io_capacity脏页刷新
IO线程
InnoDB存储引擎使用很多AIO,和IO线程主要负责IO请求回调。您可以使用innodb_read_io_threads和innodb_write_io_threads参数列表调整。
清除线程
在交易提交。与undolog相关交易可能不再需要。清除线程用于回收撤销不需要的页面时。
pagecleaner螺纹
负责脏页的刷新操作,减少主线程的工作和用户查询线程的阻塞。
内存缓冲池
在数据库修改的页面,首先修改页面缓冲池中,然后刷新到磁盘的某一频率,这意味着一个刷新回磁盘没有触发时,在缓冲池页面变化被刷新,但不是检查点技术的缓冲池的大小。配置可以由innodb_buffer_pool_size。
缓冲池的数据页的类型有:数据页、索引页,撤销页,插入缓冲,自适应哈希索引,存储在InnoDB锁信息,词典信息。
现在,InnoDB存储引擎允许多个缓冲池的实例。这减少了锁竞争通过散列到不同的缓冲池的实例。此参数可以通过innodb_buffer_pool_instance。
缓冲池是一个大的内存区域,和数据库的LRU算法管理。但由于全表扫描的考虑。因此,简单的LRU算法不使用,添加到LRU列表中点位置。新读页不直接放在LRU列表第一部分,但在中点位置。默认情况下,在5 / 8的LRU列表的长度。它是由innodb_old_blocks_pct控制参数。
插入缓冲
对插入和更新操作的非聚集索引,InnoDB存储引擎不直接插入索引页,但插入缓冲器的insertbuffer和辅助索引叶节点的合并,然后在一定的频率进行,通常将多个随机插入操作。非聚集可转位刀片的性能大大提高。
InnoDB使用insertbuffer条件:
索引是非聚合索引。
索引不是唯一的(如果它是唯一的,您需要找到索引以确保唯一)
Insert Buffer的内部实现
插入缓冲区的数据结构是一棵B+树,在MySQL 4.1之后,世界上只有一棵B+树,它负责插入缓冲区。所有表的辅助指标,而这棵树是存储在共享表空间,这是ibdata1默认。因此,如果表中的数据只能通过独立的表空间IBD文件恢复,它可能会导致失败。在插入缓冲区数据恢复表的辅助索引也需要。
插入缓冲区的非叶节点存储在查询键中,该查询键被构造为空格(4字节)+标记(1字节)+偏移量(4字节)。空格表示记录所在表的表空间ID,偏移量表示页的偏移量。标记用于与旧版本兼容。
插入缓冲的叶子是建立在几点如空间+标记+偏移+元数据+记录。空间,标记,偏是如上所述的相同含义。元数据的ibuf_rec_offset_count节省2字节整数排序记录到插入缓冲的命令。这个命令返回的记录正确的价值。从叶节点插入缓冲器第五列,它是各种记录实际插入。
在插入缓冲指数启用,该辅助索引页的记录可以被插入到插入缓冲B +树。为了确保每个合并成功插入到缓冲区中,必须要有一个地方,可以标记为每个辅助索引页的可用空间。Insert Buffer是标有特殊的页面,这是插入缓冲区位图类型。每个插入缓冲区位图页是用来追踪16384页,即256区。每个插入缓冲位图页在16384页的第二页。每个辅助索引页面占位4个字节,它主要是用来表示可用的索引页面的数量。
合并插入缓冲
在下面的例子中,插入缓冲区中的记录被合并到实际的辅助索引中:
从缓冲池读取辅助索引页;
当没有可用空间时,插入缓冲位图页被跟踪到辅助索引页;
主线程调度;
通过这种方式,一个辅助操作将辅助索引页上的多个记录操作合并到原始辅助索引页中,以提高性能。
二写(双写)
InsertBuffer带来了性能的InnoDB存储引擎,和两写入InnoDB存储引擎是数据页的可靠性。
它可能会怀疑如果写入失败时,它是不可能通过重做日志恢复日志这真是个办法,但必须知道日志记录页的物理操作,如偏移800,和the'aaa' record.however,如果页面已经损坏,它是重做它毫无意义。这意味着必须有一份正确的页面修改前的页面。当写入失败的情况下,页面的页的复印件先恢复,然后重做,即双写。
双写两部分组成,一部分是双写缓冲区的内存,另一部分是连续128页的共享表空间上的物理磁盘,和大小与内存一致(2m)。当刷新缓冲池中的页面,它不直接写盘,但memcpy双写缓冲区后,它是由双写缓冲分为两次,和1M数据写在每一个时间在共享表空间,然后立即调用fsync同步磁盘。这写因为双写的共享表空间的页是连续的,所以开销不是很大。在写双页写,写在双页写缓冲区为每个表空间是一个离散写。
如果操作系统在将页面写入磁盘的过程中崩溃,那么您可以从共享表空间中的双写缓冲页中找到该页的副本。
自适应哈希索引
InnoDB存储引擎会监控查询的索引页上的表格,如果你观察一个哈希索引的建立,你就可以带出速度。哈希索引的建立,这就是所谓的自适应哈希索引(AHI)。
AHI要求连续访问模式这一页必须相同。例如,一个联合索引,如(a,b),开始访问模式可以使其成为可能:
A = XXX
在XXX和YYY B = =
访问模式的查询条件相同。如果上面的查询操作进行alternately.ahi不成立。
此外,AHI也需要访问100次,同样的模式,和页面访问N次,通过这一模式,其中n = 1 / 16页
刷新相邻页面
当一个脏页刷新,InnoDB存储引擎检测到在页面区域的所有页面,如果它是一个肮脏的一页,它将刷新在一起。
异步io
InnoDB使用异步IO处理磁盘操作。
检查点技术
为了避免数据丢失问题,在数据库系统中通常采用写前日志策略,当提交文件时,先编写重做日志,然后修改页面。
然而,重做日志不能无限大,而且缓冲值(不刷新到磁盘脏页)不能无限大,即使是无限的,数据库停机恢复时间也很长,所以需要检查点技术,才能解决:
缩短数据库恢复时间;
当缓冲池不足时,可以将脏页刷新到磁盘。
当重做日志不可用(重做日志回收),刷新脏页的磁盘;
数据库重启后停机,不需要重做所有日志,因为检查点前的页面已经刷新到磁盘,数据库只需要在检查点后重做重做日志,从而大大缩短了恢复时间。
InnoDB,版本实际上与LSN相比(日志序列号)。LSN是一个8字节,每一页有一个LSN,重做日志与LSN和LSN的检查点,可以通过以下命令观察
MySQL >显示引擎INNODB STATUS G;
…
日志序列号92561351052
日志刷新至92561351052
最后检查点92561351052
上述InnoDB架构和细节(InnoDB存储引擎的读书笔记总结)都是萧边分享你的内容。我希望能给你一个参考,希望你能支持它。
主线程
核心后台线程负责异步刷新缓冲池的数据到磁盘。例如,刷新脏页、插入缓冲区的合并、撤消页的恢复等。
每秒一次操作:
1。日志缓冲区被刷新到磁盘,即使事务尚未提交,操作总是会发生,这是为较大事务提交的短时间。
2。当IO压力很小(IO数发生在1s内小于5% innodb_io_capacity),5% innodb_io_capacity插入缓冲相结合。
三.当脏页率大于innodb_max_dirty_pages_cnt,在innodb_io_capacity缓冲池的脏页刷新到磁盘。否则,如果innodb_adaptive_flush打开,更新的脏页数量将根据buf_flush_get_desired_flush_rate刷新。
每10秒操作一次:
1。如果在10 IO操作比过去innodb_io_capacity,在innodb_io_capacity缓冲池的脏页刷新到磁盘。
2。合并5% innodb_io_capacity插入缓冲器。
三.将日志缓冲区刷新到磁盘。
4。删除无用的撤消页。
5。如果缓冲池中的脏页的比例超过70%,刷新innodb_io_capacity脏页再到磁盘。否则,10% innodb_io_capacity脏页刷新。
后台循环(当数据库空闲或数据库关闭时):
1。删除无用的撤消页。
2。合并innodb_io_capacity插入缓冲器。
刷新循环(数据库空闲):
1。innodb_io_capacity脏页刷新
IO线程
InnoDB存储引擎使用很多AIO,和IO线程主要负责IO请求回调。您可以使用innodb_read_io_threads和innodb_write_io_threads参数列表调整。
清除线程
在交易提交。与undolog相关交易可能不再需要。清除线程用于回收撤销不需要的页面时。
pagecleaner螺纹
负责脏页的刷新操作,减少主线程的工作和用户查询线程的阻塞。
内存缓冲池
在数据库修改的页面,首先修改页面缓冲池中,然后刷新到磁盘的某一频率,这意味着一个刷新回磁盘没有触发时,在缓冲池页面变化被刷新,但不是检查点技术的缓冲池的大小。配置可以由innodb_buffer_pool_size。
缓冲池的数据页的类型有:数据页、索引页,撤销页,插入缓冲,自适应哈希索引,存储在InnoDB锁信息,词典信息。
现在,InnoDB存储引擎允许多个缓冲池的实例。这减少了锁竞争通过散列到不同的缓冲池的实例。此参数可以通过innodb_buffer_pool_instance。
缓冲池是一个大的内存区域,和数据库的LRU算法管理。但由于全表扫描的考虑。因此,简单的LRU算法不使用,添加到LRU列表中点位置。新读页不直接放在LRU列表第一部分,但在中点位置。默认情况下,在5 / 8的LRU列表的长度。它是由innodb_old_blocks_pct控制参数。
插入缓冲
对插入和更新操作的非聚集索引,InnoDB存储引擎不直接插入索引页,但插入缓冲器的insertbuffer和辅助索引叶节点的合并,然后在一定的频率进行,通常将多个随机插入操作。非聚集可转位刀片的性能大大提高。
InnoDB使用insertbuffer条件:
索引是非聚合索引。
索引不是唯一的(如果它是唯一的,您需要找到索引以确保唯一)
Insert Buffer的内部实现
插入缓冲区的数据结构是一棵B+树,在MySQL 4.1之后,世界上只有一棵B+树,它负责插入缓冲区。所有表的辅助指标,而这棵树是存储在共享表空间,这是ibdata1默认。因此,如果表中的数据只能通过独立的表空间IBD文件恢复,它可能会导致失败。在插入缓冲区数据恢复表的辅助索引也需要。
插入缓冲区的非叶节点存储在查询键中,该查询键被构造为空格(4字节)+标记(1字节)+偏移量(4字节)。空格表示记录所在表的表空间ID,偏移量表示页的偏移量。标记用于与旧版本兼容。
插入缓冲的叶子是建立在几点如空间+标记+偏移+元数据+记录。空间,标记,偏是如上所述的相同含义。元数据的ibuf_rec_offset_count节省2字节整数排序记录到插入缓冲的命令。这个命令返回的记录正确的价值。从叶节点插入缓冲器第五列,它是各种记录实际插入。
在插入缓冲指数启用,该辅助索引页的记录可以被插入到插入缓冲B +树。为了确保每个合并成功插入到缓冲区中,必须要有一个地方,可以标记为每个辅助索引页的可用空间。Insert Buffer是标有特殊的页面,这是插入缓冲区位图类型。每个插入缓冲区位图页是用来追踪16384页,即256区。每个插入缓冲位图页在16384页的第二页。每个辅助索引页面占位4个字节,它主要是用来表示可用的索引页面的数量。
合并插入缓冲
在下面的例子中,插入缓冲区中的记录被合并到实际的辅助索引中:
从缓冲池读取辅助索引页;
当没有可用空间时,插入缓冲位图页被跟踪到辅助索引页;
主线程调度;
通过这种方式,一个辅助操作将辅助索引页上的多个记录操作合并到原始辅助索引页中,以提高性能。
二写(双写)
InsertBuffer带来了性能的InnoDB存储引擎,和两写入InnoDB存储引擎是数据页的可靠性。
它可能会怀疑如果写入失败时,它是不可能通过重做日志恢复日志这真是个办法,但必须知道日志记录页的物理操作,如偏移800,和the'aaa' record.however,如果页面已经损坏,它是重做它毫无意义。这意味着必须有一份正确的页面修改前的页面。当写入失败的情况下,页面的页的复印件先恢复,然后重做,即双写。
双写两部分组成,一部分是双写缓冲区的内存,另一部分是连续128页的共享表空间上的物理磁盘,和大小与内存一致(2m)。当刷新缓冲池中的页面,它不直接写盘,但memcpy双写缓冲区后,它是由双写缓冲分为两次,和1M数据写在每一个时间在共享表空间,然后立即调用fsync同步磁盘。这写因为双写的共享表空间的页是连续的,所以开销不是很大。在写双页写,写在双页写缓冲区为每个表空间是一个离散写。
如果操作系统在将页面写入磁盘的过程中崩溃,那么您可以从共享表空间中的双写缓冲页中找到该页的副本。
自适应哈希索引
InnoDB存储引擎会监控查询的索引页上的表格,如果你观察一个哈希索引的建立,你就可以带出速度。哈希索引的建立,这就是所谓的自适应哈希索引(AHI)。
AHI要求连续访问模式这一页必须相同。例如,一个联合索引,如(a,b),开始访问模式可以使其成为可能:
A = XXX
在XXX和YYY B = =
访问模式的查询条件相同。如果上面的查询操作进行alternately.ahi不成立。
此外,AHI也需要访问100次,同样的模式,和页面访问N次,通过这一模式,其中n = 1 / 16页
刷新相邻页面
当一个脏页刷新,InnoDB存储引擎检测到在页面区域的所有页面,如果它是一个肮脏的一页,它将刷新在一起。
异步io
InnoDB使用异步IO处理磁盘操作。
检查点技术
为了避免数据丢失问题,在数据库系统中通常采用写前日志策略,当提交文件时,先编写重做日志,然后修改页面。
然而,重做日志不能无限大,而且缓冲值(不刷新到磁盘脏页)不能无限大,即使是无限的,数据库停机恢复时间也很长,所以需要检查点技术,才能解决:
缩短数据库恢复时间;
当缓冲池不足时,可以将脏页刷新到磁盘。
当重做日志不可用(重做日志回收),刷新脏页的磁盘;
数据库重启后停机,不需要重做所有日志,因为检查点前的页面已经刷新到磁盘,数据库只需要在检查点后重做重做日志,从而大大缩短了恢复时间。
InnoDB,版本实际上与LSN相比(日志序列号)。LSN是一个8字节,每一页有一个LSN,重做日志与LSN和LSN的检查点,可以通过以下命令观察
MySQL >显示引擎INNODB STATUS G;
…
日志序列号92561351052
日志刷新至92561351052
最后检查点92561351052
上述InnoDB架构和细节(InnoDB存储引擎的读书笔记总结)都是萧边分享你的内容。我希望能给你一个参考,希望你能支持它。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。