Java性能调优实战
刘超
金山软件西山居技术经理
立即订阅
7535 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 怎样才能做好性能调优?
免费
模块一 · 概述 (2讲)
01 | 如何制定性能调优标准?
02 | 如何制定性能调优策略?
模块二 · Java编程性能调优 (10讲)
03 | 字符串性能优化不容小觑,百M内存轻松存储几十G数据
04 | 慎重使用正则表达式
05 | ArrayList还是LinkedList?使用不当性能差千倍
加餐 | 推荐几款常用的性能测试工具
06 | Stream如何提高遍历集合效率?
07 | 深入浅出HashMap的设计与优化
08 | 网络通信优化之I/O模型:如何解决高并发下I/O瓶颈?
09 | 网络通信优化之序列化:避免使用Java序列化
10 | 网络通信优化之通信协议:如何优化RPC网络通信?
11 | 答疑课堂:深入了解NIO的优化实现原理
模块三 · 多线程性能调优 (10讲)
12 | 多线程之锁优化(上):深入了解Synchronized同步锁的优化方法
13 | 多线程之锁优化(中):深入了解Lock同步锁的优化方法
14 | 多线程之锁优化(下):使用乐观锁优化并行操作
15 | 多线程调优(上):哪些操作导致了上下文切换?
16 | 多线程调优(下):如何优化多线程上下文切换?
17 | 并发容器的使用:识别不同场景下最优容器
18 | 如何设置线程池大小?
19 | 如何用协程来优化多线程业务?
20 | 答疑课堂:模块三热点问题解答
加餐 | 什么是数据的强、弱一致性?
模块四 · JVM性能监测及调优 (6讲)
21 | 磨刀不误砍柴工:欲知JVM调优先了解JVM内存模型
22 | 深入JVM即时编译器JIT,优化Java编译
23 | 如何优化垃圾回收机制?
24 | 如何优化JVM内存分配?
25 | 内存持续上升,我该如何排查问题?
26 | 答疑课堂:模块四热点问题解答
模块五 · 设计模式调优 (6讲)
27 | 单例模式:如何创建单一对象优化系统性能?
28 | 原型模式与享元模式:提升系统性能的利器
29 | 如何使用设计模式优化并发编程?
30 | 生产者消费者模式:电商库存设计优化
31 | 装饰器模式:如何优化电商系统中复杂的商品价格策略?
32 | 答疑课堂:模块五思考题集锦
模块六 · 数据库性能调优 (8讲)
33 | MySQL调优之SQL语句:如何写出高性能SQL语句?
34 | MySQL调优之事务:高并发场景下的数据库事务调优
35 | MySQL调优之索引:索引的失效与优化
36 | 记一次线上SQL死锁事故:如何避免死锁?
37 | 什么时候需要分表分库?
38 | 电商系统表设计优化案例分析
39 | 数据库参数设置优化,失之毫厘差之千里
40 | 答疑课堂:MySQL中InnoDB的知识点串讲
模块七 · 实战演练场 (4讲)
41 | 如何设计更优的分布式锁?
42 | 电商系统的分布式事务调优
43 | 如何使用缓存优化系统性能?
44 | 记一次双十一抢购性能瓶颈调优
结束语 (1讲)
结束语 | 栉风沐雨,砥砺前行!
Java性能调优实战
登录|注册

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

刘超 2019-08-20
你好,我是刘超。
MySQL 是一个灵活性比较强的数据库系统,提供了很多可配置参数,便于我们根据应用和服务器硬件来做定制化数据库服务。如果现在让你回想,你可能觉得在开发的过程中很少去调整 MySQL 的配置参数,但我今天想说的是我们很有必要去深入了解它们。
我们知道,数据库主要是用来存取数据的,而存取数据涉及到了磁盘 I/O 的读写操作,所以数据库系统主要的性能瓶颈就是 I/O 读写的瓶颈了。MySQL 数据库为了减少磁盘 I/O 的读写操作,应用了大量内存管理来优化数据库操作,包括内存优化查询、排序以及写入操作。
也许你会想,我们把内存设置得越大越好,数据刷新到磁盘越快越好,不就对了吗?其实不然,内存设置过大,同样会带来新的问题。例如,InnoDB 中的数据和索引缓存,如果设置过大,就会引发 SWAP 页交换。还有数据写入到磁盘也不是越快越好,我们期望的是在高并发时,数据能均匀地写入到磁盘中,从而避免 I/O 性能瓶颈。
SWAP 页交换:SWAP 分区在系统的物理内存不够用的时候,就会把物理内存中的一部分空间释放出来,以供当前运行的程序使用。被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间的数据被临时保存到 SWAP 分区中,等到那些程序要运行时,再从 SWAP 分区中恢复保存的数据到内存中。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java性能调优实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • vic
    这个专栏的综合质量真的很高, 不懂为什么订阅量这么少。
    2019-08-21
    1
    10
  • 张学磊
    通过在内存中维护一个链表,并使用LRU(最近最少使用)算法淘汰非热点数据

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

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

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

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

    作者回复: 👍

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

    作者回复: 👍

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

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

    2019-08-20
    1
    2
  • 超威丶
    其实内存分配也是分了新老区,防止大量的历史数据数据的查询占用整个内存,热点数据缓存命中率降低,不止是LRU淘汰这么简单
    2019-08-20
    2
  • godtrue
    尴尬 MySQL 一直用不过自己到没怎么调整过他的配置参数,本地库没什么问题就是开发使用,生产库基本属于看不见摸不着的状态有专门的DBA来维护,OK,打卡,自己在本地也可以玩一把!
    2019-09-15
  • DY
    老师,你好。有个问题请教下。select id from order_detail where order_id between 5000 and 10000;这种sql根据索引查询,为什么当条件是=时不回表,是区间段时就回表。非聚簇索引的叶子结点存放的不是主键吗?怎么索引查询区间段时就回表了

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

    2019-09-11
    2
  • 张德
    记得好像是lru算法 新旧比例好像是5比3

    作者回复: 对的

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

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

    2019-08-21
  • 晓杰
    mysql8.0已经没有用查询缓存了

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

    2019-08-21
收起评论
12
返回
顶部