• MySQL InnoDB架构


    一、InnoDB架构

    InnoDB架构
        Memory
            Buffer Pool
                用途
                    缓存InnoDB表、索引以及其他辅助buffer
                组成
                    Data/Index Page Cache
                    Change Buffer
                        用途
                            当受影响的索引页不在BF中时,先缓存对非唯一索引页的更改(DML)到CB
    当其他读取操作把该修改对应的页从磁盘读取到BF中时,就会合并该CB对象中保存的记录到辅助索引页中
                        参数
                            innodb_change_buffering:优化非唯一辅助索引延迟写入,以便按顺序执行I/O操作
                            innodb_change_buffer_max_size:设置Change Buffer占用Buffer Pool的百分比
                        监控
                            SHOW ENGINE INNODB STATUSG结果中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) 组成。
    默认一个页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

  • 相关阅读:
    架构-LAMP特级学习(网站加速解决方案)
    架构-LAMP特级学习(网站大存储量解决方案)
    架构-LAMP特级学习(网站大访问量解决方案)
    Shell-学习笔记
    算法-随手写的冒泡排序
    算法-随手写的二分查找
    cocos2dx 3.x ccPositionTextureColor_vert与ccPositionTextureColor_noMVP_vert
    cocos2dx当节点存在缩放时要注意的问题
    cocos2dx 3.x draw debug
    cocos2dx 3.x ccDrawLine一个坑
  • 原文地址:https://www.cnblogs.com/Uest/p/12385973.html
Copyright © 2020-2023  润新知