MySQL InnoDB架构

一、InnoDB架构

InnoDB架构
    Memory
        Buffer Pool
            用途
                缓存InnoDB表、索引以及其他辅助buffer
            组成
                Data/Index Page Cache
                Change Buffer
                    用途
                        当受影响的索引页不在BF中时,先缓存对非唯一索引页的更改(DML)到CB\n当其他读取操作把该修改对应的页从磁盘读取到BF中时,就会合并该CB对象中保存的记录到辅助索引页中
                    参数
                        innodb_change_buffering:优化非唯一辅助索引延迟写入,以便按顺序执行I/O操作
                        innodb_change_buffer_max_size:设置Change Buffer占用Buffer Pool的百分比
                    监控
                        SHOW ENGINE INNODB STATUS\G结果中INSERT BUFFER AND ADAPTIVE HASH INDEX部分
                Adaptive Hash Index
                    用途
                        InnoDB存储引擎自动根据访问的频率和模式为索引中的热点数据建立哈希索引,提高检索效率
                    参数
                        innodb_adaptive_hash_index
                        innodb_adaptive_hash_index_parts
            管理
                Free List
                    Free List中存放的都是未曾使用的空闲Page
                LRU List
                    midpoint insertion strategy:InnoDB收回最近最少使用的页面,并将新页面添加到列表的中间(位置由innodb_old_blocks_pct控制)
                    page hash链表,通过space_id和page_no快速找到数据页;这个hash表不是InnoDB的AHI,AHI是为了减少Btree的扫描
                Flush List
                    所有被修改过且还没来得及被flush到磁盘上的Page(脏页)
        Redo Log Buffer
            用途
                缓存写入到redo log中的数据
            参数
                innodb_log_buffer_size:用于写入磁盘上的redo log的缓冲区的字节大小,通常8M-32M
                innodb_flush_log_at_trx_commit:1写磁盘、2写系统缓存(操作系统挂可能丢数据)、0写logbuffer(mysql挂可能丢数据)
                innodb_flush_log_at_timeout:刷日志的频率(默认1秒),这个刷日志频率和commit动作无关
        Doublewrite Buffer
            用途
                防止表空间中的页损坏后无法恢复
            流程
                Buffer Pool中的脏数据写入到数据文件前需先写Doublewrite Buffer
            参数
                innodb_doublewrite
                innodb_flush_method
            监控
                innodb_dblwr_pages_written/innodb_dblwr_writes = 64:1
    Thread
        后台线程(5.7)
            Master Thread(1个)
                每秒工作内容
                    刷新dirty page到磁盘
                    执行change buffer merge
                    刷redo log buffer到磁盘
                    checkpoint
                        目的
                            定期确认redo log落盘,避免数据丢失,并提高crash recovery效率
                        什么时候触发
                            buffer pool脏数据太多,把脏页刷到磁盘,释放内存
                            redo log快用完了,把脏页刷新到磁盘
                            redo log切换时
                        分类
                            sharp checkpoint:将所有的脏页刷新到磁盘
                            fuzzy checkpoint:持续将脏页刷新到磁盘
                    检查dict table cache,判断有无要删除table cache对象
                每10秒工作内容
                    刷新dirty page到磁盘
                    执行change buffer merge
                    刷redo log buffer到磁盘
                    undo purge
                    checkpoint
                实例关闭时
                    工作内容
                        刷redo log buffer到磁盘
                        change buffer merge
                        checkpoint
                    innodb_fast_shutdown
                        0,slow,full purge,change buffer merge
                            版本升级
                            主从切换
                            实例迁移
                            物理关机/重启
                        1,默认,fast,skip these operations
                        2,flushes logs,cold shut,like crashed
                优化建议
                    避免dirty page堆积,适当调小innodb_max_dirty_pages_pct
                    避免undo堆积,适当调大innodb_purge_batch_size
                    及时checkpoint,调整innodb_flush_log_at_trx_commit
                    保持事务持续平稳提交
            Flushing Thread(默认4个, Page Cleaner)
                目的:将脏页刷新落地到磁盘,默认每1秒刷一次
                方式
                    LRU Flushing
                    Adaptive Flushing
                工作内容
                    将脏页拷到double write buffer
                    将double write buffer写dblwr文件并sync到磁盘
                    将dirty page写到.ibd数据文件并sync到磁盘
                参数
                    innodb_page_cleaners
                    innodb_io_capacity_max:每秒刷新的脏页上限
                    innodb_lru_scan_depth:每个buffer pool instance的lru上扫描的深度
            Purge Thread(默认4个)
                目的:做GC(garbage collection)
                工作内容
                    删除辅助索引中不存在的记录
                    删除已被打了delete-marked标记的记录
                    删除不再需要的undo log
                参数
                    innodb_purge_threads
                    innodb_purge_bacth_size
            IO Thread(10个)
                io_ibuf_thread(1个):主要负责插入缓冲区的合并操作
                io_log_thread(1个):用于将重做日志redo log buffer刷新到日志文件redo log file中
                io_read_thread(默认4个):负责数据库的异步I/O读取操作
                io_write_thread(默认4个):负责数据库的异步I/O写操作
            Lock Monitor Thread(1个)
            Error Monitor Thread(1个)
        前台线程
            compress_gtid_table:GTID压缩线程
            one_connection:用户连接线程
            slave_io:IO_Thread
            slave_sql:SQL_Thread
            slave_worker:并行复制,接收并应用SQL线程分发的主库binlog日志
    图片
        innodb-architecture
        InnoDB内部结构
    逻辑结构
        Tablespace
            所有的数据都逻辑的存放在一个空间中,称为表空间。表空间由段(segment)、区(extent)、页(page) 组成。\n默认一个页16KB为数据库的最小管理单元,操作系统的最小管理单元为512k
        Segment
            数据段
            索引段
        Extent
            区是连续的页组成,每个区的大小始终为1MB,一个区中包含64连续的数据页
            page size<=16KB,区大小是1MB;page size=32KB,区大小是2MB;page size=64KB,区大小是4MB
            在表创建之初,先分配32个页,针对小表可以节省空间,使用完这32个页之后,才会按每次分配1个区,
        Page
            页类型
                INFORMATION_SCHEMA.INNODB_BUFFER_PAGE表中的PAGE_TYPE
            innodb_page_size:默认16KB,仅在初始化实例时能指定页面大小
        Row
            最大行长度略小于数据库页面的一半
            行溢出
                COMPACT and REDUNDANT Row Formats
                DYNAMIC and COMPRESSED Row Formats
    Disk
        Tablespaces
            System Tablespace(ibdata1)
                存储对象
                    Data Dict:InnoDB相关的元数据;8.0元数据存储在MySQL Data Dictionary
                    Change Buffer:purge operation周期性将辅助索引的变更刷新到磁盘
                    Doublewrite Buffer:脏页在刷新时首先顺序写到Doublewrite buffer,再写回数据文件
                    Rollback Segments:指向Undo的索引,Undo用于存储旧版本的数据
                参数
                    innodb_data_file_path
            File-Per-Table Tablespace(.ibd)
                用途
                    用户表独立于System Tablespace,Buffer Pool中的脏数据定期flush到数据文件.ibd
                参数
                    innodb_file_per_table
                修改innodb_file_per_table只会影响之后创建的表,原先使用共享表空间的表,需通过alter table xxx engine=innodb转换
                表空间管理
                    消除碎片
                        alter table xx engine=innodb;
                        尽量使用pt-osc操作
                    回收空间
                        独立:alter table xx engine=innodb;共享:导出、导入
                        尽量使用pt-osc操作
                    表空间传输
                        主要用于单表备份恢复
            Undo Tablespaces
                用途
                    Undo Log独立于System Tablespace,需在数据库初始化处理;主要存储事务过程产生的旧版本数据,Undo Log定期Purge
                参数
                    innodb_undo_directory:undo文件存放目录,默认数据文件目录
                    innodb_undo_logs/innodb_rollback_segments:回滚段的个数(默认128个),存储undo slot指向undo space
                    innodb_undo_tablespaces:undo表空间个数,每个文件默认10M
            Temporary Tablespace(ibtmp1)
                用途
                    保存通用临时表和SQL执行过程中产生的内部临时表,不记录redo log
                参数
                    innodb_temp_data_file_path
            General Tablespace
                多个表放在同一个表空间中
                可以定义多个通用表空间,并且分别放在不同的磁盘上
                可以减少metadata的存储开销
        Redo Log(ib_logfile*)
            用途
                crash recovery,逻辑物理日志;Redo Log Buffer定期flush到Redo Log
            参数
                innodb_log_group_home_dir:默认datadir,可以自行指定一个路径
                innodb_log_file_size:单个redo log大小,通常1G-4G
                innodb_log_files_in_group:redo log个数,通常3-5个
            监控
                建议将ib_logfile*文件总大小设置满足一个小时redo空间
        Undo Logs
            存储于
                Undo Tablespaces
                Temporary Tablespace
            分类
                insert_undo:insert操作,只用于回滚
                update_undo:update/delete操作,用于一致性读+回滚
View Code

MySQL 8.0 InnoDB Architecture

Percona XtraDB Internals

posted @ 2020-02-29 23:20  Uest  阅读(380)  评论(0编辑  收藏  举报