原文出处:https://www.infoworld.com/article/3210905/sql/10-essential-performance-tips-for-mysql.html

MySQL的10个基本性能技巧

与所有的关系数据库一样,MySQL正如一头怪兽一般,
它可能会在接到通知的一瞬间陷入停顿,让你的应用程序陷入困境,让你的业务处于危险之中。真是的情况是,常见的错误是导致MySQL性能问题的根源。
工作负载或配置陷阱中的一些微妙之处常常会掩盖这些信息,为了确保MySQL服务器以最快的速度运行,提供稳定一致的性能,消除这些错误是很重要的。
幸运的是,很多MySQL的性能问题都有相似的解决方案,使的故障排除和调优MySQL成为一项易于管理的任务。

MySQL性能提示1:配置您的工作负载

了解服务器究竟把时间花在哪些地方的最佳方法是分析服务器的工作负载,
通过分析工作负载,您可以导出最大代价的查询以进行进一步调优,当向服务器发出请求的时候,时间就是最重要的指标,
你几乎不关心任何事情,只关心它完成得有多快。配置工作负载的最佳方法是使用MySQL Enterprise Monitor的查询分析器或Percona工具包中的pt-query-digest之类的工具。

这些工具捕获服务器执行的查询,并返回一个任务表,按照响应时间的顺序进行排序,立即将代价最大和最耗时的任务排在最前面,这样您就可以看到您的工作重点在哪里。
工作负载分析工具将类似的查询组合在一起,允许您查看缓慢的查询,以及快速但多次执行的查询。

译者注:找到一些top的sql或者说是执行频率高的sql,这部分是关注的重点

MySQL性能提示2:了解四种基本资源

为了完成数据库服务的功能,数据库服务器需要四种基本的资源:CPU,内存,磁盘以及网络,
如果其中任意一项是弱项(瓶颈),不稳定或者超负荷,那么,数据库服务器的性能很可能很差。
了解基本资源在两个特定领域非常重要:选择硬件和故障排除问题。
在为MySQL选择硬件时,确保所有组件都具有良好的性能。同样重要的是,要很好地平衡它们。
通常,购买组织会选择具有快速cpu和磁盘的服务器,但这些服务器内存不足。在某些情况下,增加内存是提高性能的一种廉价方法,尤其是在磁盘绑定的工作负载上。
这看起来似乎违反直觉,但在许多情况下,磁盘被过度使用,因为没有足够的内存来容纳服务器的工作数据集。

这种平衡的另一个很好的与cpu有关的例子。
在大多数情况下,MySQL在使用快速cpu时表现良好,因为每个查询在单个线程中运行,不能在cpu之间并行化。
在进行故障排除时,请检查所有4种资源的性能和利用率,并仔细检查它们的性能是否很差,或者是否出现某些硬件超负载运行。这些知识可以帮助快速解决问题。

译者注:CPU,内存,磁盘以及网络需要匹配,任何一个短板,都可能造成性能上的问题

MySQL性能提示3:不要把MySQL当做队列使用

队列和类似队列的访问模式可以在您不知情的情况下潜入应用程序。
例如,如果您设置了一个项目的状态,以便某个特定的工作进程可以在对其进行操作之前声明它,那么您无意中创建了一个队列。
将电子邮件标记为未发送,发送,然后标记为发送是一个常见的例子。
队列导致问题的主要原因有两个:它们序列化您的工作负载,防止任务被并行执行,并且它们常常导致一个表,其中包含正在处理的工作以及来自很久以前处理的任务的历史数据。
既增加了应用程序的延迟,又将其加载到MySQL。

译者注:MySQL不是做队列使用的,不要使用高频率的定时任务像用队列一样去刷数据库。

MySQL性能提示4:先过滤最代价最小的结果
优化MySQL的一个好方法是先做一些廉价的、不精确的工作,然后再对较小的数据集进行艰苦的、精确的工作。
例如,假设您在一个给定的地理点半径范围内寻找某物。
许多程序员工具箱中的第一个工具是计算球体表面距离的大圆公式。
这种技术的问题是,这个公式需要大量的三角运算,这是非常cpu密集型的运算。大圆计算往往运行缓慢,使计算机的CPU利用率飙升。
在应用大圆公式之前,将您的记录减少到总数的一小部分,并将结果集修剪到一个精确的圆。
一个包含圆(精确或不精确)的正方形是一个简单的方法。这样一来,方块外的世界就不会受到那些昂贵三角函数的冲击。

译者注:没看懂

MySQL性能提示5:了解两个可伸缩性死亡陷阱

可伸缩性并不像您所认为的那样模糊。事实上,对于可伸缩性有精确的数学定义,可以用方程表示。这些方程强调了为什么系统不能像应有的那样伸缩。
以通用可伸缩性定律为例,该定义在表示和量化系统的可伸缩性特征方面非常方便。它从两个基本成本的角度解释了扩展问题:序列化和串扰。
为了实现序列化而必须停止的并行进程在可伸缩性方面天生有限。同样地,如果并行进程需要一直彼此聊天来协调它们的工作,那么它们就限制了彼此。
避免序列化和串扰,您的应用程序将更好地扩展。这在MySQL中意味着什么?
它会有所不同,但是有些例子会避免排它锁。由于这个原因,上面第三点的队列往往难以扩展。

译者注:没看懂

MySQL性能提示6:不要过渡关注配置

dba倾向于花费大量时间来调整配置。结果通常不是很大的改善,有时甚至是适得其反的。
我看到过很多“优化”过(调整过某些配置参数)的服务器,在负载较重的时候,经常崩溃宕机、内存不足、性能表现的很差。
MySQL自带的默认设置是一刀切的,而且已经过时了,但是您不需要配置所有内容,并不意味着任何配置选项都要人为修改。
只有在需要的时候,最好是在了解其背景的情况下再去更改配置项。
在大多数情况下,通过正确设置10个(左右,常用)选项,您可以获得95%的服务器峰值性能。只有极少数情况下需要修改一些特殊的配置项。

在大多数情况下,不建议使用服务器“调优”工具,因为它们往往提供的指导方针对特定情况没有意义。
有些甚至有危险的、不准确的建议,比如缓存命中率和内存消耗公式。这些永远都不对,而且随着时间的流逝,它们变得越来越不正确。

译者注:大多数情况下主需要关注几个基本配置就可以了,不需要关注所有的配置信息,随意修改配置,有可能会导致适得其反,
有人会说修改bufferpool配置之后性能怎么怎么样,因为由一些本来就很low的错误引起的问题,并不是需要过渡关注配置的理由。

MySQL性能提示7:注意分页查询

涉及分页的应用程序往往会使服务器陷入瘫痪。
应用程序中在向您显示一个结果页面时,有一个链接指向下一个页面,
这些应用程序通常以无法使用索引的方式进行分组和排序,导致服务器消耗大量的资源,然后根据页面和显示行数的要求,然后显示这其中一部分数据。

优化常常可以在用户界面中找到。您可以只显示到下一个页面的链接,而不是显示结果和每个页面的链接的确切数目。
您还可以防止人们转到离首页太远的页面。

在查询端,您可以选择比需要的多一行,而不是使用LIMIT和offset(进行精确地显示具体的行),
当用户单击“下一页”链接时,您可以指定最后一行作为下一组结果的起点。
例如,如果用户查看了第101行到第120行的页面,那么还可以选择第121行;
要呈现下一页,您需要查询服务器上大于或等于121的行,限制21。

译者注:这里作者应该是想表达,分页的时候,如果没有合适的索引,每一次翻页,都会会造成大量的查询和排序,分页查询需要合理的索引以及一些设计上的技巧。

MySQL性能提示8:保存性能基线信息,必要时才发出告警

监视和警报是必不可少的,但是典型的监视系统会发生什么变化呢?
它开始发送误报,系统管理员设置了电子邮件过滤规则来阻止噪音。很快你的监控系统就完全没用了。
(译者注:不管是什么问题,随随便便就发出告警,慢慢就麻木了,其结果是会慢慢地忽略所有的告警信息)

我喜欢以两种方式考虑监视:捕获(性能)指标和警报。
捕获并保存所有可能的度量是非常重要的,因为当您试图确定系统中发生了什么变化时,您会很高兴地拥有它们。
有一天,如果出现一个奇怪的问题,您会通过一个图表并显示服务器工作负载变化的情况。

相比之下,人们往往过于警觉。
人们经常对诸如缓冲区命中率或每秒创建的临时表的数量之类的事情保持警惕。
问题是,对于这样一个比率,没有一个好的阈值。正确的阈值不仅在不同的服务器之间不同,而且随着工作负载的变化也会不同。
(译者注:很多指标并没有一个标准值,比如创建临时表的频率,跟服务器的软硬件环境以及工作类型都有关系
如果收集了历史的性能指标数据,遇到一些异常问题的时候,可以根据历史性能基线与当前情况对比,提供分析问题的依据)
因此,只有在表明一个明确的、可操作的问题的情况下,才要谨慎地发出警报(不是所有问题都需要告警的,只有严重的问题才需要)。
低缓冲区命中率是不可随意告警的,也不表示真正的问题,但是不响应连接请求的服务器是需要解决的实际问题。

译者注:正确合理的配置告警以及收集性能基线

 MySQL性能提示9:学习三种索引规则

索引可能是数据库中最容易被误解的话题,因为索引的工作方式有很多种,以及服务器如何使用它们。
要真正理解索引的工作原理,需要付出很多努力。
如果设计得当,索引在数据库服务器中有三个重要用途:

索引允许服务器查找相邻行的组,而不是单个行。
很多人认为索引的目的是找到单独的行,但是,查找单个行会导致随机磁盘操作,这很缓慢。
找到一组行比一次找到一行要好得多,所有行或大部分行都很有趣。
索引可以让服务器避免按需要的顺序读取行来进行排序。排序是昂贵的。按需要的顺序读取行要快得多。
索引使服务器能够单独满足来自索引的所有查询,从而完全避免访问表。这被称为覆盖索引或索引查询。

如果您可以设计索引和查询来利用这三个机会,那么您可以使您的查询快几个数量级。

译者注:索引,一个很大的话题,很多时候需要具体情况具体分析,没有定论,但是绝对不是网上那些low到爆的什么索引使用1,2,3,4,5……几条规则。

MySQL性能提示10:利用同行的专业知识

不要试图独自去做。如果你在苦苦思索一个问题,并且做着对你来说合乎逻辑和明智的事情,那就太好了。20次中有19次是这样的。
另一次,你会陷入一个非常昂贵和耗时的兔子洞,因为你正在尝试的解决方案似乎很有意义。
构建一个与mysql相关的资源网络——这超出了工具集和故障排除指南的范围。有一些知识渊博的人潜伏在邮件列表、论坛、问答网站等等。
会议、商展和本地用户组活动提供了宝贵的机会,可以获得见解,并与在紧急情况下可以帮助你的同行建立关系
对于那些正在寻找补充这些技巧的工具的人,您可以查看MySQL的Percona Configuration向导、MySQL的Percona Query Advisor以及Percona监视插件。(注意:您需要创建一个Percona帐户来访问前两个链接。它是免费的。)配置向导可以帮助您为新服务器生成一个基线my.cnf文件,该文件优于随服务器一起发布的示例文件。Percona监视插件是一组监视和绘图插件,可以帮助您急切地保存统计数据,并不情愿地发出警告(第8).所有这些工具都是免费的。

译者注:学无止境,保持谦虚,永远要向强人学习,不懂的不要瞎逼逼。

(译)MySQL的10个基本性能技巧的更多相关文章

  1. (译)关于使用Eclipse Memory Analyzer的10点小技巧

    作者 Rave_Tian 2016.02.01 17:56* 字数 2988 阅读 520评论 0喜欢 0 分析和理解应用的内存使用情况是开发过程中一项不小的挑战.一个微小的逻辑错误可能会导致监听器没 ...

  2. DBA必备:MySQL数据库常用操作和技巧

    DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...

  3. 101个MySQL的调节和优化技巧

    MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...

  4. 10 个实用技巧,让 Finder 带你飞

    Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组织和使用 Mac 里的几乎所有东西,包括应用程序.文件 ...

  5. 怎么跳出MySQL的10个大坑

    淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合作,共向 ...

  6. Visual Studio 原生开发的10个调试技巧(二)

    原文:Visual Studio 原生开发的10个调试技巧(二) 我以前关于 Visual Studio 调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原 ...

  7. MySql 插入10位以上长度的字符报错or截断

    当a字段为int类型时: 如果用MyBatis向MySql插入10个字符以上长度的字符串,则会报错. 如果直接在MySql中用sql语句插入10个字符以上长度的字符串,则会变成最大的int类型数值:2 ...

  8. 淘宝内部分享:怎么跳出MySQL的10个大坑

    编者按:淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合 ...

  9. ★10 个实用技巧,让Finder带你飞~

    10 个实用技巧,让 Finder 带你飞 Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组织和使用 ...

随机推荐

  1. 20175202 《Java程序设计》第三周学习总结

    20175209 2018-2019-2 <Java程序设计>第三周学习总结 教材知识点总结 1.编程语言发展阶段: 面向机器语言——面向过程语言——面向对象语言. 2.类声明: 类名必须 ...

  2. windows 端口转发

    1.添加端口转发 netsh interface portproxy add v4tov4 listenport=5000 listenaddress=10.30.3.148 connectport= ...

  3. NGUI外包开发总结一下今天的收获

    先总结一下今天的收获:在一个脚本类中对其成员变量进行初始化时,什么时候在Awake()中,什么时候在Start()中是有讲究的. 1)当成员变量会被外部脚本引用时,尤其是该成员变量是一个自己定义的非脚 ...

  4. 生成用于ROM初始化的coe文件---使用matlab

    生成用于ROM初始化的coe文件---使用matlab t=0:2*pi/2^12:2*pi; y=0.5*sin(t)+0.5; r=ceil(y*(2^8-1)); fid = fopen('si ...

  5. 使用Microsoft.Office.Interop.Excel.dll 文件来生成excel 文件

    日常工作中经常需要将后台的数据导出成excel  格式,这里通过调用微软提供的类库来生成excel 文件. 具体是引用 了Microsoft.Office.Interop.Excel.dll 类库文件 ...

  6. MFC 单文档调用对话框

    1.插入新的Dialog,如下图: 2.修改ID位 IDD_XMB 3.在单文件的Menu 中选中需要链接的按键,右键添加处理程序,如下图所示,添加完成后,在项目的xxxview.cpp中会生成如下函 ...

  7. webview之如何设计一个优雅健壮的Android WebView?(下)(转)

    转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...

  8. Tree Traversals Again

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...

  9. Hibernate若干知识点

    1.主从表 主表A与从表B关联: 若存在1:N关系,查询条件为B表字段写法为: list.add(criteriaBuilder.like(root.joinList("projectCon ...

  10. Postman Could not get any response

    在使用postman时遇到的小问题,记录一下: 报错信息如下: Could not get any response There was an error connecting to https:// ...