技术内幕-innodb

  • 1Memory 存储引擎默认使用哈希索引,而不是 B+ Tree索引,不支持 TEXT 和 BLOB 列类型。

  • 2MySQL 数据库使用 Memory 存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于 Memory 存储引擎表的容量设置,又或者中间结果含有 TEXT 或者 BLOB 字段,则 MySQL 数据库会把其转换成 MyISAM 存储引擎表而存在磁盘中。MyISAM 不缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。

  • 3Innodb 内存数据对象包括 缓冲池(innodb_buffer_pool)、重做日志缓冲(redo_log_buffer)、额外内存池(innodb_additional_mem_pool_size)。

  • 4缓冲池(innodb_buffer_pool)不仅仅包含索引页(index page)、数据页(data page) 还包括 插入缓冲(insert buffer)、锁信息(lock info)、自适应哈希索引、数据字典信息。

  • 5在 InnoDB 存储引擎中,缓冲池中页的大小默认为 16 KB,使用 LRU 算法对缓冲池进行管理。

  • 6对普通的 LRU 算法进行了改进,加入了 midpoint 位置。把 LRU 列表一分为二,前面 5/8 是 new 列表,后面 3/8 是 old 列表,从磁盘新读入的页放在距离尾部 3/8 的位置(参数innodb_old_blocks_pct 默认值为 37 表示新读取的页插入到LRU列表尾端的37% 的位置差不多 3/8 的位置),可以防止在某个全表扫描的查询把之前的热数据缓存全部剔除。关于何时将数据从 old 列表放到 new 列表中,书上说通过另一个参数 innodb_old_blocks_time,用于表示页读取到 mid 位置需要等待多久才会加入到 new 列表中。在网上看到一个更靠谱的说法,当页在缓存中被第二次引用,即放到 new 列表的头部。大概是不同版本的不同实现,参考链接 https://arpitbhayani.me/blogs/mysql-cache。

  • 7数据库更新操作采用 Write Ahead Log 策略,先写 redo log(宕机时用于恢复数据),再更新缓冲池。一条 DML 语句更新了缓冲池中的页数据,导致和磁盘页数据不一致称为脏页。

  • 8为避免每次更新都将脏页刷回磁盘带来的性能损耗,使用 Checkpoint(检查点) 技术将脏页刷回磁盘。对于 InnoDB 使用 LSN(Log Sequence Number) 来标记版本。每个页、重做日志、Checkpoint 中都有 LSN, Checkpoint 之前的页都已经刷回磁盘,异常恢复只需要从 Checkpoint 之后恢复。主线程定时触发、LRU 空闲页不够、重做日志不可用、脏页太多都会触发 Checkpoint。

  • 9重做日志缓冲刷盘时机:
    1)主线程每隔 1s 将重做日志缓冲刷新到重做日志文件,即使事务没有提交,这也是为什么再大的事务提交时间都很短的原因
    2)每个事务提交时,由参数 innodb_flush_log_at_trx_commit 控制,为了保证事务的 ACID 中的持久性,必须设置为 1,表示在执行 commit 时将重做日志缓冲同步到磁盘,即伴有 fsync 的调用。
    3)重做日志缓冲区空间不足 1/2
    4)按 512字节(磁盘一个扇区的大小) 为单位进行写入。因为磁盘扇区是写入的最小单位,可以确保原子性,所以不需要double write

  • 10插入缓冲(Insert Buffer)
    B+ 树实现,主要解决非唯一二级索引插入性能低(非顺序插入)的问题,不直接操作索引页,在 Insert Buffer 中暂存,再通过一定的触发机制合并操作。

  • 11两次写(double write)
    解决部分写失效(partial page write),比如一页 16k 数据刷盘时只成功了 4k,崩溃时无法通过 redo log 恢复的问题。在对缓冲池脏页刷新时,不直接写磁盘,通过 memcpy 函数复制到 doublewrite buffer 中,然后通过顺序写入共享表空间中,最后再去从 doublewrite buffer 中 fsync 刷到磁盘。如果出现部分写失效恢复数据的时候,会从共享表空间中还原该页再进行恢复。

  • 12binlog 三种格式
    Statement:sql 的逻辑语句,紧凑占空间小,IO效率高,一些内置函数比如取当前时间在主从之间表现不一致,需要保证 Repeatable Read 及以上隔离级别。参考链接http://mysql.taobao.org/monthly/2018/08/04/
    Row:记录下每一行数据修改的细节,修改成什么值,需要更多的空间,确保主从之间数据一致,可以将隔离级别改成 Read Commited,获得更大的并发性。
    Mixed:混合上面两种

  • 13binlog 刷盘机制
    默认是缓冲写,在宕机时可能造成数据丢失,可以通过修改 sync_binlog = 1,表示不使用操作系统的缓冲,直接使用同步写磁盘的方式记录 binlog。事务提交之前 binlog 已经记录了此时发生宕机,重启的时候事务会被回滚,如果 binlog 里记录了日志就会有问题,可以通过 innodb_support_xa 来解决,会用到 二阶段提交。

  • 14 innodb是如何存储数据的
    reference

  • 来源群友分享

  • 加群请加wx: tutengdihuang

innodb技术核心摘录相关推荐

  1. 推进五通一平:手淘技术核心三大容器 五大方案首次整体亮相 百川开放全面升级...

    在云栖大会上,马云提出五个"新",新零售.新制造.新金融.新技术和新能源,称将对各行各业造成巨大的影响,成为决定未来成败的关键.而五个新的实现,也必须是各行各业共同推进,整个生态共 ...

  2. 区块链入门与去中心化应用实战 之一 第3章 区块链技术核心原理实现

    第3章 区块链技术核心原理实现 建立项目,确定区块结构 实现区块类结构-添加交易 实现创建区块 实现工作量证明 添加节点通信功能 交易接口实现 挖矿接口实现 实现注册节点 实现共识机制

  3. mysql limit acs_Oracle Acs资深顾问罗敏 老罗技术核心感悟:牛! 11g的自动调优和

    作者为:? SHOUG成员 – ORACLE ACS高级顾问罗敏 多年前的一段往事 记得多年以前在一个10g平台的数据仓库项目上遇到一个非常难优化的SQL语句,当时即便我采集了统计信息.甚至在语句中增 ...

  4. 沈剑:技术核心管理者的时间,都只花在这 20% 的事情上

    前言 今天跟大家分享的话题是:作为一名企业的技术核心管理者,我们应该规划和思考哪些问题?作为管理者,我接下来将分享三个问题,希望在这个过程中,大家也与我一起来思考和探讨: 关于战略: 关于能力建设: ...

  5. SHA1 算法加密技术核心思想

    SHA1 算法加密技术核心思想 一.认知 1.在我们的平时生活中,经常会接触到一些密码,通过这些密码,能对我们的一些资产和隐私的东西做到保护作用,比如: 古墓密码锁 暗号:天王盖地虎,..... 美国 ...

  6. Session、Cookie和Token的简介、技术核心和实现原理

    文章目录 Cookie .Session .Token 1.Cookie 1.1.cookie 简介 1.2.Cookie 核心技术 1.3.Cookie 原理 1.4.Cookie 细节 2.Ses ...

  7. 区块链笔记 - 《区块链技术核心概念与原理讲解》

    说明:笔记内容来源于慕课网<区块链技术核心概念与原理讲解>视频课程.如有侵权,请联系删除. 目录 1.区块链前世今生 2.区块链前景 3.比特币是什么 4.比特币原理 4.1 账本如何验证 ...

  8. 《电子科技​》电子技术核心期刊征稿

    <电子科技>电子技术核心期刊征稿 来源:天天期刊网    日期:2013-08-01 11:43:28 期刊名称: 电子科技 期刊级别: 学报 周期: 月刊 国内统一刊号: CN:61-1 ...

  9. 基于无人机的智能物流终端投送系统——小程序技术核心

    小程序技术核心: 1.使用WXML+WXS+JavaScript原生开发方式. 原生开发功能更强大,原生开发的小程序应用,都是将需要的功能开发出来,添加到小程序应用的安装包当中,故而这类小程序应用的安 ...

最新文章

  1. grep 的特殊使用
  2. 2021人工智能年度评选报名即将截止,3大类别6大奖项等你申报
  3. LeetCode-两个结构分别遍历,然后合并
  4. 阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则
  5. Falsy Bouncer-freecodecamp算法题目
  6. Python中用numpy进行图片处理
  7. mac在命令行里获取root权限
  8. LeetCode(1108)——IP 地址无效化(JavaScript)
  9. matlab 辅助函数 —— 文件下载与文件解压
  10. logisim数据选择器_基于Logisim的CRC编码电路实现.pdf
  11. 【批处理bat】注释一段文本/字符串
  12. 3.1 电压频率变换器
  13. APP多平台快速切换
  14. 使用c++实现复数类的运算
  15. AW9523B IIC驱动
  16. oracle增加表空间文件
  17. 希捷的2种企业级硬盘
  18. 计算机软件不是出租的主要标的时 著作人,计算机软件著作权免责声明中应包括哪些重要责任...
  19. 新手小白一行代码快速生成HTML代码块
  20. 北邮人导航html代码,北邮人导航 · BYR-Navi 的安装与配置

热门文章

  1. 关于Kubernetes 桌面客户端 Aptakube 的一些笔记整理
  2. python环境配置和安装
  3. 转 暴雪总裁总结游戏十条经验
  4. jmockit教程_jmockit demo
  5. <<计算机操作系统(慕课版)>>第七章参考答案
  6. Google 大佬们为什么要开发 Go 这门新语言?
  7. ORA-01111 ORA-01110
  8. 英文期刊论文查重率多少合格?
  9. ubuntu双系统扩容
  10. I/O设备与主机信息传送的控制方式