Java 性能调优实战
刘超
前金山软件技术经理
58205 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
开篇词 (1讲)
模块一 · 概述 (2讲)
结束语 (1讲)
Java 性能调优实战
15
15
1.0x
00:00/00:00
登录|注册

40 | 答疑课堂:MySQL中InnoDB的知识点串讲

你好,我是刘超。
模块六有关数据库调优的内容到本周也正式结束了,今天我们一起串下 MySQL 中 InnoDB 的知识点。InnoDB 存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。

InnoDB 体系架构

InnoDB 主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包括缓存磁盘数据、redo log 缓冲等;后台线程则包括了 Master Thread、IO Thread 以及 Purge Thread 等;由 InnoDB 存储引擎实现的表的存储结构文件一般包括表结构文件(.frm)、共享表空间文件(ibdata1)、独占表空间文件(ibd)以及日志文件(redo 文件等)等。

1. 内存池

我们知道,如果客户端从数据库中读取数据是直接从磁盘读取的话,无疑会带来一定的性能瓶颈,缓冲池的作用就是提高整个数据库的读写性能。
客户端读取数据时,如果数据存在于缓冲池中,客户端就会直接读取缓冲池中的数据,否则再去磁盘中读取;对于数据库中的修改数据,首先是修改在缓冲池中的数据,然后再通过 Master Thread 线程刷新到磁盘上。
理论上来说,缓冲池的内存越大越好。我们在第 38 讲中详细讲过了缓冲池的大小配置方式以及调优。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 性能调优实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 到此刻Java性能调优实战算是从头到尾的学习了一遍,首先,为老师的敬业态度点赞,跟着老师也学习到了许多性能调优的方法和技巧。之前也看过书,加入目前的公司后加班比较严重,看书的效率也不高了,从去年在极客时间学习后就一发不可收拾买了几十个专栏,现在还有许多未开始学习,不过买专栏有种令人安心的感觉,每天也在不断的学习,看的多了发现不同的专栏重复的内容也多了,当然,看不完了还继续买,我觉得买专栏的钱其实相对于学习到的知识来讲是非常值得的。哪怕只学习一遍,有些专栏值得一刷再刷,毕竟写专栏的老师水货少,极客时间选择讲师的专业性,也是我不断在这里付费的一个原因。我发现没有九阳神功真是学什么都慢,在计算机的世界里计算机组成原理/操作系统原理/编译原理/计算机网络原理/计算机数据库原理/数据结构与算法这些就是九阳神功,如果这些精通,什么这个那个招式全都一学就会且速度快印象深。 计算机界所有的这个理论那个原理基本都是围绕性能和容量在做文章,都想要更快的速度更大的存储空间,在升一层就是为了和时间赛跑开拓更为广阔的空间,快能占据许多的先机,不管什么行业快都具有优势。在极客时间我感觉增长见闻的效率还是挺高的,不过不看书还是不行,深度细致度系统性这些知识体验还是不能和书媲美。不学习是不可能的,人生如逆水行舟不进则退,其实学习的慢也会渐渐失去竞争优势。好奇老师这么多知识积累了多久?都是怎么积累的?除了坚持还有什么别巧妙嘛? 我的同事中有一位非常拼命,两年学习的东西顶别人四五年,住在公司附近几乎每天都疯狂加班学习,现在也非常厉害从工资上来说已经秒杀了许多工作七八年的人。先去阿里再去拼多多,真是太拼了,生活就是上班加班学习。其实我也想这么拼,我也想年入百万,不过即使时间付出的差不多,人的脑回沟及过往的受教育经历特别是思维方式的训练加英语的加持也会导致非常大的差异。 嗯,感慨有点多,继续加油吧!保持好学习的节奏,买的专栏或书,如果不看不学,还不如买几卷卫生纸。 再次感谢老师的分享,我相信有朝一日我也会像老师一样牛逼!

    作者回复: 👍加油

    4
    28
  • 拒绝
    老师,本讲的缓存池是基于引擎层的缓存吗?与server层的缓存有什么不同? 每个页存放的行记录也是有硬性定义的,最多允许存放 16KB/2-200行,即7992行,是怎么计算来的?

    作者回复: 对的,我们之前讨论过server层的cache,主要是是根据我们查询SQL的hash值作为key,查询结果作为value值保存在cache层。而存储引擎层的缓冲池,缓冲了很多类型的数据,例如索引页、数据页等。 如果一张表的数据经常被新增、更新、删除,则导致Cache层的失效率非常高,从而导致频繁清除已缓存的数据,server层的cache可能会增加数据库的性能,在MySQL8.0已经移除该功能,建议我们在业务层或数据库中间代理层来缓存查询的结果。例如mybatis和hibernate中利用一级缓存来缓存频繁查询的数据。

    3
    6
  • 平凡之路
    老师,您好,我一直有个疑问,如果数据库设置最大连接数为1000,如果像电商系统这样的网站,同时有10000个人访问登录,那不是有9000人都要等待?电商系统是用的其他数据库存储系统吗?

    作者回复: 如果是同一时刻都进入到数据库,其他9000人肯定是在等待状态。数据库操作都是毫秒级的,1000人使用完之后,空闲的连接会被释放出来,所以哪怕是9000人等待,后面也会在一秒之内完成。

    4
    4
  • 张学磊
    老师,客户端读取数据时,如果数据存在于缓冲池中,客户端就会直接读取缓冲池中的数据,否则将磁盘中的数据加载到缓冲池,再从缓冲池中读取,客户端始终和缓冲池交互,准确的说是不是应该这样? 另外有一处编辑错误,InnoDB 存储引擎是面向列的(row-oriented),应该写成行。

    作者回复: 优先与缓冲池交互。问题已改正,谢谢指正。

    2
  • 天天向上
    老师在:MySQL8.0取消cache 那岂不是每次查询都要访问磁盘 这样不合理吧 的回复中回答:还有一层缓冲池。但是缓冲池命中的概率很低很低吧。

    作者回复: 如果频繁访问且变更非常少的数据,建议在业务层进行缓存。

    1
  • 张德
    老师 MySQL8.0取消cache 那岂不是每次查询都要访问磁盘 这样不合理吧 还是我理解错了

    作者回复: 不会的,还有一层缓冲池

    2
    1
  • ty_young
    老师您好,请问Master Thread回收的undo页和Purge Thread回收的undo log是一回事么

    作者回复: 在InnoDB 1.1之前,这个动作在master thread中进行,在1.1之后,独立到了purge thread中进行,所以是一回事。

  • 许童童
    老师讲得很好,这个知识串讲很不错,跟着老师一起精进。

    作者回复: 一起进步

  • 楞伽山人
    老师 您好 undo log是解决ACID中的A吧 不是C吧
    2
    1
  • FiRerOUNd
    我理解的innodb没有实现redolog,这个是mysql服务器层实现的,所有存储引擎共同这个文件。
    归属地:北京
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部