首页 >> 生活 >

MySQL的10个基本性能提示

2022-10-08 13:46:01 来源: 用户: 

  这里有10个技巧可以提高MySQL的性能。

  了解服务器如何使用时间的最佳方法是分析服务器的工作负载。通过分析工作负载,可以公开最昂贵的查询以进行进一步调优。在这里,时间是最重要的度量,因为当您对服务器发出查询时,除了它完成的速度之外,您几乎不关心其他任何事情。

  配置工作负载的最佳方法是使用诸如MySQL Enterprise Monitor的查询分析器或Percona工具包中的pt-query-digest之类的工具。这些工具捕获服务器执行的查询,并返回一个按响应时间降序排序的任务表,立即将最昂贵和最耗时的任务排在最前面,这样您就可以看到应该将工作重点放在哪里。

  工作负载分析工具将类似的查询分组到一行中,允许您查看运行缓慢的查询,以及运行快速但执行了多次的查询。

  MySQL性能提示2:了解四种基本资源功能,数据库服务器需要四种基本资源:CPU、内存、磁盘和网络。如果其中任何一个是弱的、不稳定的或过载的,那么数据库服务器很可能执行得很差。

  理解基础资源在两个特定领域非常重要:选择硬件和故障排除问题。

  在为MySQL选择硬件时,确保所有组件都有良好的性能。同样重要的是,平衡好它们之间的关系。通常,组织会选择cpu和磁盘速度快但内存不足的服务器。在某些情况下,添加内存是将性能提高几个数量级的廉价方法,特别是在磁盘限制的工作负载上。这似乎违反直觉,但在许多情况下,磁盘被过度利用了,因为没有足够的内存来保存服务器的工作数据集。

  这种平衡的另一个好例子与cpu有关。在大多数情况下,MySQL在高速cpu上运行得很好,因为每个查询都在一个线程中运行,不能跨cpu并行化。

  在进行故障排除时,请检查所有四种资源的性能和利用率,仔细检查它们的性能是否很差,或者只是被要求做太多的工作。这些知识可以帮助快速解决问题。

  MySQL性能提示3:不要使用MySQL作为一个队列,类似队列的访问模式可能会在你不知道的情况下潜入你的应用程序。例如,如果您设置了一个项的状态,以便某个特定的工作进程可以在对其进行操作之前声明它,那么您在不知情的情况下创建了一个队列。将邮件标记为未发送,发送,然后标记为已发送是一个常见的例子。

  队列导致的问题主要有两个原因:它们序列化了工作负载,阻止了任务的并行执行,并且它们通常会导致一个表,其中包含正在处理的工作以及很久以前处理的作业的历史数据。两者都增加了应用程序的延迟并加载到MySQL。

  优化MySQL的一个好方法是先做便宜的、不精确的工作,然后在更小的结果数据集上做艰苦的、精确的工作。

  例如,假设您在某个地理点的给定半径内寻找某个东西。许多程序员工具箱里的第一个工具是大圆(Haversine)公式,用于计算球面上的距离。这种技术的问题是,这个公式需要大量的三角运算,这是非常cpu密集型的。大圆计算往往运行缓慢,使机器的CPU利用率飙升。

  在应用大圆公式之前,将您的记录减少到总数的一个小子集,并将结果集修剪到一个精确的圆。包含圆的正方形(精确地或不精确地)是一种简单的方法。这样,正方形之外的世界就不会被那些昂贵的三角函数所困扰。

  MySQL性能提示5:了解两种可伸缩性死亡陷阱可伸缩性并不像你想象的那么模糊。事实上,对于可伸缩性有精确的数学定义,可以用公式表示。这些方程强调了为什么系统不能像它们应该的那样缩放。

  以通用可伸缩性定律为例,该定义便于表达和量化系统的可伸缩性特征。它从两个基本成本方面解释了伸缩问题:序列化和串扰。

  为了进行序列化而必须停止的并行进程在其可伸缩性方面存在固有的限制。同样地,如果并行进程需要一直与其他进程通信以协调它们的工作,它们就会互相限制。

  避免序列化和串扰,您的应用程序的可伸缩性会更好。这在MySQL中意味着什么?它是不同的,但是一些例子会避免行上的独占锁。出于这个原因,上面第3点提到的队列的伸缩性往往很差。

  MySQL性能提示6:不要太关注配置dba往往会花大量时间调整配置。结果通常不是很大的改善,有时甚至是非常有害的。我见过许多“优化的”服务器不断崩溃,内存耗尽,当工作负载变得更紧张时性能很差。

  MySQL附带的默认设置是“一刀切”式的,而且非常过时,但是您不需要配置所有内容。最好是正确设置基础,只有在需要时才更改其他设置。在大多数情况下,通过正确设置大约10个选项,您可以获得95%的服务器峰值性能。少数情况下,这并不适用将是独特的边缘情况,你的情况。

  在大多数情况下,不推荐使用服务器“调优”工具,因为它们给出的指导原则对特定情况没有意义。有些甚至有危险的、不准确的建议编码在其中——比如缓存命中率和内存消耗公式。这些从来都不是正确的,随着时间的流逝,它们变得越来越不正确。

  MySQL性能提示7:注意分页查询,因为分页会使服务器崩溃。在向您显示一个页面的结果时,这些应用程序通常以不能使用索引的方式进行分组和排序,它们使用了限制和偏移量,这会导致服务器生成大量工作,然后丢弃行。

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

  在查询端,您可以选择比需要的多一行,而不是使用LIMIT和offset,当用户单击“下一页”链接时,您可以将最后一行指定为下一组结果的起点。例如,如果用户查看的页面从第101行到第120行,那么也可以选择第121行;要呈现下一页,您需要查询服务器是否有大于或等于121的行,限制为21。

  MySQL性能提示8:急切地保存统计数据,不情愿地发出警报监视和警报是必要的,但是典型的监视系统会发生什么呢?它开始发送误报,系统管理员设置了电子邮件过滤规则来阻止噪音。很快你的监控系统就完全没用了。

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

  相比之下,人们往往过于警惕。人们经常对缓冲区命中率或每秒创建的临时表的数量之类的事情发出警报。问题是,这样的比例没有一个好的阈值。正确的阈值不仅在服务器之间不同,而且随着工作负载的变化,每小时也不同。

  因此,只有在明确的、可操作的问题出现的情况下,才应保持警惕。较低的缓冲区命中率是不可操作的,也不表示存在真正的问题,但是服务器不响应连接尝试是需要解决的实际问题。

  索引可能是数据库中最容易被误解的主题,因为在索引的工作方式和服务器的使用方式上有很多地方会让人感到困惑。要真正理解发生了什么需要付出很多努力。

  索引如果设计正确,在数据库服务器中有三个重要的用途:

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

  MySQL性能提示10:利用你的同行的专业知识不要试图单干。如果你对一个问题感到困惑,做你认为合乎逻辑和合理的事情,那是很好的。20次中大概有19次是有效的。另一种情况下,你会陷入一个非常昂贵和耗时的“兔子洞”,因为你尝试的解决方案似乎很有意义。

  建立一个mysql相关资源的网络——这超出了工具集和故障排除指南的范围。有一些非常博学的人潜伏在邮件列表、论坛、问答网站等。会议、贸易展和本地用户组活动为您提供了宝贵的机会,帮助您获得真知灼见并与能够在紧急情况下帮助您的同行建立关系。

  对于那些寻找工具来补充这些提示的人,您可以查看myMySQL配置工具、Query Advisor工具和percona监控插件。配置工具可以帮助您为新服务器生成一个基线my.cnf文件,该文件优于随服务器附带的示例文件。Percona Monitoring是一组监控和图形化插件,可以帮助您急切地保存统计数据并不情愿地发出警报(第8条)。

  免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!

 
分享:
最新文章