一、逻辑存储结构表空间(ibd文件),一个MySQL实例可以对应多个表空间 , 用于存储记录 , 索引等数据 。
文章插图
段 , 分为数据段、索引段、回滚段 , innodb是索引组织表 , 数据段就是B+Tree的叶子节点 , 索引段为非叶子节点 , 段用来管理多个区 。
区 , 表空间的单元结构 , 每个区的大小为1M,默认情况下 , innodb存储引擎页大小为16K , 即一个区中一共有64个连续的页 。
页 , 是innodb存储引擎磁盘管理的最小单元 , 每个页的大小为16K , 为了保证页的连续性 , innodb存储引擎每次从磁盘申请4~5个区 。
行 , innodb存储引擎数据是按行进行存储的 。Trx_id 最后一次事务操作的id、roll_pointer滚动指针 。
innodb的内存结构 , 由Buffer Pool、Change Buffer和Log Buffer组成 。
Buffer Pool: 缓冲池是主内存中的一个区域 , 里面可以缓存磁盘上经常操作的真实数据 , 在执行增删改查操作时 , 先操作缓冲池中的数据(若缓冲池么有数据 , 则从磁盘加载并缓存) , 然后再以一定频率刷新磁盘 , 从而减少磁盘IO , 加快处理速度 。
缓冲池以page页为单位 , 底层采用链表数据结构管理page , 根据状态 , 将page分为三种类型:
1、free page 即空闲page , 未被使用 。
2、clean page 被使用page , 数据没有被修改过 。
3、dirty page 脏页 , 被使用page , 数据被修改过 , 这个page当中的数据和磁盘当中的数据 不一致 。说得简单点就是缓冲池中的数据改了 , 磁盘中的没改 , 因为还没刷写到磁盘 。
Change Buffer:更改缓冲区(针对于非唯一二级索引页) , 在执行DML语句时 , 如果这些数据page没有在Buffer Pool中 , 不会直接操作磁盘 , 而会将数据变更存在更改缓冲区Change Buffer中 , 在未来数据被读取时 。再将数据合并恢复到Buffer Pool中 , 再将合并后的数据刷新到磁盘中 。
二级索引通常是非唯一的 , 并且以相对随机的顺序插入二级索引页 , 同样 , 删除和更新可能会影响索引树中不相邻的二级索引页 。如果每一次都操作磁盘 , 会造成大量磁盘IO , 有了Change Buffer之后 , 我们可以在缓冲池中进行合并处理 , 减少磁盘IO 。
Adaptive Hash Index: 自适应hash索引 , 用于优化对Buffer Pool数据的查询 , InnoDB存储引擎会监控对表上各索引页的查询 , 如果观察到hash索引可以提升速度 , 则建立hash索引 , 称之为自适应hash索引 。无需人工干预 , 系统根据情况自动完成 。
参数:
innodb_adaptive_hash_index
mysql> show variables like '%hash_index%';+----------------------------------+-------+| Variable_name | Value |+----------------------------------+-------+| innodb_adaptive_hash_index | ON || innodb_adaptive_hash_index_parts | 8 |+----------------------------------+-------+2 rows in set (0.01 sec)
Log Buffer: 日志缓冲区 , 用来保存要写入到磁盘中的log日志数据(redo log、undo log) , 默认大小为16M , 日志缓冲区的日志会定期刷新到磁盘中 , 如果需要更新 , 插入或删除许多行的事务 , 增加日志缓冲区的大小可以节省磁盘IO 。参数: innodb_log_buffer_size 缓冲区大小
innodb_flush_log_at_trx_commit 日志刷新到磁盘时机
文章插图
innodb_flush_log_at_trx_commit=1 表示日志在每次事务提交时写入并刷新到磁盘
2 表示日志在每次事务提交后写入 , 并每秒刷新到磁盘一次
0 表示每秒将日志写入并刷新到磁盘一次 。
InnoDB 的磁盘结构 , 由系统表空间(ibdata1) , 独立表空间(*.ibd),通用表空间 , 撤销表空间(undo tablespaces), 临时表空间(Temporary Tablespaces), 双写缓冲区(Doublewrite Buffer files), 重做日志(Redo Log).
【MySQL innodb引擎深入讲解】系统表空间(ibdata1): 系统表空间是更改缓冲区的存储区域 , 如果表是在系统表空间而不是每个表文件或者通用表空间中创建的 , 它也可能包含表和索引数据 。
推荐阅读
- 阿里云RDS迁移,极简安装 MySQL TokuDB 引擎
- 我C,MySQL双主架构,原来能这么玩
- 6个MySQL GUI工具,数据库管理必备
- 还不知道MySQL怎么给字符串加索引?
- Python通过MySQLdb访问操作MySQL数据库
- linux安装mysql启动不起来总结
- 面试题-Mysql数据库优化之垂直分表
- MySQL-锁机制详述
- 用于相似图片搜索引擎的Python OpenCV图像直方图
- 浅聊mysql外连接查询