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

39 | 数据库参数设置优化,失之毫厘差之千里

你好,我是刘超。
MySQL 是一个灵活性比较强的数据库系统,提供了很多可配置参数,便于我们根据应用和服务器硬件来做定制化数据库服务。如果现在让你回想,你可能觉得在开发的过程中很少去调整 MySQL 的配置参数,但我今天想说的是我们很有必要去深入了解它们。
我们知道,数据库主要是用来存取数据的,而存取数据涉及到了磁盘 I/O 的读写操作,所以数据库系统主要的性能瓶颈就是 I/O 读写的瓶颈了。MySQL 数据库为了减少磁盘 I/O 的读写操作,应用了大量内存管理来优化数据库操作,包括内存优化查询、排序以及写入操作。
也许你会想,我们把内存设置得越大越好,数据刷新到磁盘越快越好,不就对了吗?其实不然,内存设置过大,同样会带来新的问题。例如,InnoDB 中的数据和索引缓存,如果设置过大,就会引发 SWAP 页交换。还有数据写入到磁盘也不是越快越好,我们期望的是在高并发时,数据能均匀地写入到磁盘中,从而避免 I/O 性能瓶颈。
SWAP 页交换:SWAP 分区在系统的物理内存不够用的时候,就会把物理内存中的一部分空间释放出来,以供当前运行的程序使用。被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间的数据被临时保存到 SWAP 分区中,等到那些程序要运行时,再从 SWAP 分区中恢复保存的数据到内存中。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 性能调优实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 张学磊
    通过在内存中维护一个链表,并使用LRU(最近最少使用)算法淘汰非热点数据

    作者回复: 对的,MySQL基于LRU算法来实现淘汰非热点数据,但与我们熟悉的LRU算法不同的是,MySQL新增了一个midpoint insertion startegy策略,就是默认情况下,读取到的新页并不是直接放入的LRU列表的首部,而是LRU列表长度的5/8处,目的是为了避免由于一些不常查询SQL偶尔一次查询就把之前热点数据淘汰的情况。

    4
    41
  • 晓杰
    mysql的缓冲池(buffer_pool)使用改进版的lru算法来缓存数据,如果使用传统的lru算法,会存在预读失效和缓冲池污染的问题,为了解决预读失效问题,mysql将lru分为新生代和老生代,为了解决缓冲池污染的问题,引入老生代停留时间窗口,只有大于设置的值,才能加入新生代头部

    作者回复: 解释的比我全面,赞

    21
  • Mr.wang
    刘老师,您可以详细讲一下redolog和binlog吗,以后他们的使用场景吗?

    作者回复: redo log 是 InnoDB 存储引擎层的日志,主要记录的是该引擎的数据变更记录,有了redo log,当数据库发生宕机重启后,可通过redo log将未落盘的数据恢复,即保证已经提交的事务记录不会丢失。 而binlog 属于逻辑日志,属于server层的日志,可以记录各个存储引擎的数据变更记录,是事务提交之后的数据变更日志。 redo log可以作为异常down机或者介质故障后的数据恢复使用,而binlog可以作为误删数据恢复数据使用, binlog日志还用于主从数据库的数据同步。

    16
  • 许童童
    我来回答一下思考题: InnoDB 的缓存淘汰策略是分代的,分为老年代和新生代,大致是7:3,新数据总是先加入到新生代,如果在一定时间内有被再次查询,才会进入到老年代。老年代和新生代内部都是LRU算法来淘汰缓存页的。

    作者回复: 👍

    13
  • 晓杰
    mysql8.0已经没有用查询缓存了

    作者回复: 是的,MySQL8.0版本已经不支持查询缓存,我们文中也提到了其中的弊端。MySQL官方建议使用服务器端使用缓存或ProxySQL作为中间缓存。

    2
    5
  • LW
    IBP通过LRU链表管理热点数据和淘汰非热点数据,LRU本身分为两大区域,young区域和old区域,热点数据在young区,非热点数据在old区。其实LRU的划分还更细致,young区还划分成几个不同的区域。

    作者回复: 👍

    5
  • -W.LI-
    老师好!问个问题,这些IO操作,是同步阻塞,还是同步非阻塞啊?

    作者回复: 有不同的策略,可以实现同步和异步

    2
    3
  • DY
    老师,你好。有个问题请教下。select id from order_detail where order_id between 5000 and 10000;这种sql根据索引查询,为什么当条件是=时不回表,是区间段时就回表。非聚簇索引的叶子结点存放的不是主键吗?怎么索引查询区间段时就回表了

    作者回复: 这个操作不会引起回表

    3
  • 张德
    记得好像是lru算法 新旧比例好像是5比3

    作者回复: 对的

  • 晓杰
    老师,redo log和bin log好像不是在更新语句提交事务成功就刷新到磁盘的。

    作者回复: redo log是根据innodb_flush_log_at_trx_commit参数来设置刷新到磁盘的策略。

收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部