MySQL 数据库瓶颈对 DBA 程序员而言,是非常棘手的问题。要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?下面小编将从数据库数据库性能优化的目标和方法两方面阐述如何通过性能调优突破 MySQL 数据库性能瓶颈。

一、优化目标

1. 减少 IO 次数

IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。

2. 降低 CPU 计算

除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标。

二、优化方法

1. 改变 SQL 执行计划

明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标

2. order by 一定需要排序操作

我们知道索引数据实际上是有序的,如果我们的需要的数据和某个索引的顺序一致,而且我们的查询又通过这个索引来执行,那么数据库一般会省略排序操作,而直接将数据返回,因为数据库知道数据已经满足我们的排序需求了。

实际上,利用索引来优化有排序需求的 SQL,是一个非常重要的优化手段

3. 尽量少 join

MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在 Join 这方面所下的功夫还不够,所以性能表现离 Oracle 等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。

4. 尽量少排序

排序操作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL 的响应时间。

对于MySQL来说,减少排序有多种办法,比如:

通过利用索引来排序的方式进行优化:减少参与排序的记录条数,非必要不对数据进行排序

避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作, 而其他的至少需要执行两次排

如何通过性能调优突破 MySQL 数据库性能瓶颈?

5. 尽量用 join 代替子查询

虽然 Join 性能并不佳,但是和 MySQL 的子查询比起来还是有非常大的性能优势。MySQL 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,但是到目前已经发布的所有稳定版本中都普遍存在,一直没有太大改善。虽然官方也在很早就承认这一问题,并且承诺尽快解决,但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题。

6. 尽量少 or

当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并没有很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,造成了其性能比较低下,很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

7. 尽量用 union all 代替 union

union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。

8. 尽可能对每一条运行在数据库中的SQL进行 explain

优化 SQL,需要做到心中有数,知道 SQL 的执行计划才能判断是否有优化余地,才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化之后,很明显的问题 SQL 可能已经很少了,大多都需要去发掘,这时候就需要进行大量的 explain 操作收集执行计划,并判断是否需要进行优化。

如何通过性能调优突破 MySQL 数据库性能瓶颈?

9. 优先优化高并发的 SQL,而不是执行频率低某些“大”SQL

对于破坏性来说,高并发的 SQL 总是会比低频率的来得大,因为高并发的 SQL 一旦出现问题,甚至不会给我们任何喘息的机会就会将系统压跨。而对于一些虽然需要消耗大量 IO 而且响应很慢的 SQL,由于频率低,即使遇到,最多就是让整个系统响应慢一点,但至少可能撑一会儿,让我们有缓冲的机会。

10. 从全局出发优化,而不是片面调整

SQL 优化不能是单独针对某一个进行,而应充分考虑系统中所有的 SQL,尤其是在通过调整索引优化 SQL 的执行计划的时候,千万不能顾此失彼,因小失大。

三、总结

对于MySQL数据库进行性能优化非常重要,一方面可以提升资源使用率,另一方面可以提升业务访问速度提升用户体验。除此之外为了保障业务正常稳定的运行,同样重要的是能够及时的发现数据库存在的性能瓶颈,例如:数据库 IOPS 使用率过高,数据库存在存在慢查询等...

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理

mysql 写入性能瓶颈_如何通过性能调优突破MySQL数据库性能瓶颈?相关推荐

  1. “金三银四”春招指南之“性能调优”:MySQL+Tomcat+JVM,看完还怕面试官的轰炸?

    春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 01 MySQL性能调优 1.1 MySQL性能调优问题有哪些?怎么学? 关于这个,给大家看一份学习大 ...

  2. java大量实例化对象如何调优_成都Java性能调优技巧

    成都Java性能调优技巧.大部分建议是针对Java的.但也有若干建议是与语言无关的,可以应用于所有应用程序和编程语言.在讨论专门针对Java的性能调优技巧之前,让我们先来看看通用技巧. 1.在你知道必 ...

  3. lamp mysql大小限制_[转]LAMP 系统性能调优,第 3 部分: MySQL 服务器调优

    有 3 种方法可以加快 MySQL 服务器的运行速度,效率从低到高依次为: 替换有问题的硬件. 对 MySQL 进程的设置进行调优. 对查询进行优化. 迁移到 DB2 您正在寻找一种干净利落.无成本的 ...

  4. 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  5. 经典!《MySQL性能调优手册》高清电子版,限时 3 天免费下载

    点击上方"逆锋起笔",关注领取视频教程 ☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知的了,性能调优是MySQL ...

  6. 深入理解JVM—性能调优

    在上文中我们分析了很多性能监控工具,介绍这些工具的目的只有一个,那就是找出对应的性能瓶颈.盲目的性能调优是没有效果的,只有充分知道了哪里出了问题,针对性的结果才是立竿见影的.解决了主要的性能问题,那些 ...

  7. Java性能调优笔记

    调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多.外部处理系统的性能不足 ...

  8. 字节青训营第三课之高质量编程与性能调优实战的笔记和总结

    这是字节青训营第三课:高质量编程与性能调优实战的笔记和总结 概要 准备 尝试使用 test 命令,编写并运行简单测试 尝试使用 -bench参数,对函数进行性能测试 推荐阅读Go代码Review建议. ...

  9. 深入理解JVM性能调优

    深入理解JVM性能调优 您的评价:        收藏该经验     width="728" height="90" frameborder="0&q ...

最新文章

  1. 微信小程序获取当前城市定位
  2. python培训班时间 费用-广州python培训班收费标准
  3. 2021年李永乐6套卷一道无穷小定义的题目
  4. program的发展史与两个数学方法
  5. 谈谈IT行业的一些生存之道!
  6. 安装apex报错解决
  7. julia 数组类型转换_在Julia中确定类型的超类型
  8. 编译moveit!时缺失manipulation_msgs相关文件
  9. 碰到一个非常郁闷的事
  10. springboot网络安全平台设计毕业设计源码042335
  11. python散点图获取边界_获取离散点的边界点
  12. Win2008建立kms服务器vlmcsd
  13. CSR8811A12-ICXR-R蓝牙芯片
  14. 有趣的微分方程之齐次方程
  15. 新手python之BP神经网络——手写公式推导+可运行代码+编程中遇到的问题
  16. 王欣复出后的第一款产品
  17. openEuler 文档捉虫 2.0 上线啦,一键式提交 PR,成为开源贡献者,你也可以参与,文档伴读方案正式开源!
  18. 谈谈win10的简单美化
  19. 生信软件 | FastQC(质量控制,查看测序质量)
  20. google 学术使用技巧

热门文章

  1. VUE3 Router路由
  2. html5移动端开发(rem和媒体查询@media)
  3. pycharm无法安装第三方的包(AttributeError: module 'pip' has no attribute 'main')
  4. android基础面试题(三)
  5. word文档怎么找回误删的文件_word文件数据恢复|word文件不小心删除怎么恢复?...
  6. Unity面试题精选(3)
  7. java转码gbk_Java实现GBK转码到UTF-8(文件)
  8. OpenShift 4 之通过命令创建Service Mesh环境
  9. .net core精彩实例分享 -- 文件与I/O
  10. .Net开发人员通过WCF使用Node.js