【发布时间】:2010-09-26 14:35:45
【问题描述】:
对于 MySQL,哪个是最好的、对用户最友好的性能工具?我需要帮助确定我的设置的瓶颈。问题出在 SQL 语句、设置变量还是其他方面?
【问题讨论】:
标签: mysql performance
对于 MySQL,哪个是最好的、对用户最友好的性能工具?我需要帮助确定我的设置的瓶颈。问题出在 SQL 语句、设置变量还是其他方面?
【问题讨论】:
标签: mysql performance
坏消息:有 GUI 工具可以帮助解决这个问题,但它是一项技术娴熟且范围广泛的工作。因此它们并没有涵盖所有内容,您可能需要使用命令行内容/sql 语句等来提供帮助。我只真正使用过命令行工具。我将简要介绍一下我知道/使用过的东西:
首先,您需要一个良好的数据库设计。如果设计不好,你只能做到这一点。这包括规范化,以及为字段使用适当的类型。我将把这一点留在这里,因为我认为它有点旁白,而不是你想要的。
确保 MySQL 查询缓存已设置并正常工作,如果可以的话,给它更多的 RAM,并确保您的重要查询没有做任何阻止 mysql 缓存它们的事情。例如,在查询中使用 NOW() 函数可以做到这一点 - 原因很明显 - NOW 每秒都在变化!您可以改为将时间戳放入 sql 中,并使用最接近分钟/小时/天(您可以逃脱的最大时间段)的时间来让 mysql 获得一些缓存优势。
开始优化:在 select 前面加上“EXPLAIN”是查看查询如何执行并确定如何改进它的方法。学习解释输出:http://dev.mysql.com/doc/refman/5.0/en/using-explain.html 您通常可以向现有索引添加新索引/添加列以改进事情。但是您也会遇到需要重组查询的时候。
开始使用 MySQL 提高性能(假设您还不知道问题查询是什么)是检查慢查询日志 - 它将所有查询时间超过 x 秒的查询记录到一个文件中。
概述,包括是否尚未记录此内容的配置,在这里:http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html - 我还发现将 long_query_time 设置为 0 一天左右,以便在此处记录所有查询并记录所用时间,是一种有用的方法来了解性能的确切位置。但我不会马上去那里!并且不要让它打开,日志会变得很大。
一旦你有几天的日志记录,我从这里发现了 mysqlsla(mysql 慢日志分析器):http://hackmysql.com/mysqlsla 是一个很好的工具。
它可以做的不仅仅是慢查询日志分析 - 阅读手册。但是要解释它对慢日志的作用:慢查询日志可以包含大量数据,因此很难确定哪些查询总体上是最昂贵的 - 例如:考虑它们运行的次数以及两个查询何时在 where 子句中使用不同的 id 实际上是相同的。
MySQL sla 为您完成这一切。它贯穿日志,并且可以对 where 子句中相同/具有不同值的查询进行分组。然后它(默认情况下)向您显示总执行时间方面的前 10 个查询 - 这通常会带来一些惊喜,但通常是最有成效的起点 - 采用最昂贵的查询并在其上使用 EXPLAIN,看看您是否可以改进它。
有些查询需要很长时间,而且不容易改进。在这种情况下,您能否以另一种方式获取数据,或者至少将其缓存起来?您甚至可能会发现需要更改数据库模式。类似地,一些查询可能位于 mysqlsla 输出的顶部,因为您经常运行它们(尤其是当 long_query_time 设置为 0 时更是如此),即使它们运行得很快。也许是时候为您的应用添加一些缓存了?
http://www.maatkit.org/ 看起来也很有希望 - 从未使用过,但 mk-query-profiler 工具应该有助于进一步了解查询缓慢的原因。
还有一个完全不同的东西要查看:PHPMYADMIN 中的“状态”页面(或者您可以运行所有查询来生成此信息....) - 它以红色突出显示它认为可能不好的东西,并且可以帮助您了解分配系统资源的好处。我对此知之甚少-我的方法一直是,如果某些东西是红色的并且看起来很糟糕,请去阅读它并确定它是否重要以及我是否应该做某事(通常意味着为 MySQL 分配更多资源通过更改配置)。
最近我发现运行 SHOW PROCESSLIST 在受苦的服务器上也很有用。虽然它只为您提供实时(嗯,实时快照)信息,但它可以帮助您了解给定时间发生的事情,特别是如果您刷新几次并观察变化。我最近发现一个服务器使用每个可用的 mysql 连接来使用这种方法运行相同的查询。当然,它会在慢查询日志中,但这是查看发生了什么的一种非常快速且明显的方式。
【讨论】:
EXPLAIN 是你的朋友。除此之外,您必须同时使用临时工具、测试和操作系统工具才能准确了解发生了什么。
从操作系统工具(有助于确定情况是否受 CPU 或 IO 限制)或 MySQL 本身中可以看到的各种变量(显示全局变量、显示引擎 innodb 状态等)中可以有效地看到很多东西)。
我觉得有一个性能测试环境真的很重要。在实验室的生产级硬件上运行具有生产级负载(使用负载模拟)的生产级数据库(昂贵但必不可少)。
完成后,您可以在完全安全的情况下调整所需的任何参数,知道即使它融化了整个服务器,您也可以重建它而不会影响任何东西。
除非您在性能测试环境中对其进行了测试并发现它们确实有益,否则不要执行人们建议的具体操作。
本质上,性能调优通常按以下顺序着眼于三个方面:
前两个经常被忽略,而最后一个则有帮助,但只有在前两个完成后才能有所帮助。
不要低估减少服务器需要做的工作量的重要性 - 使用更小的字段、更少的行、更少的列等总是更好。
【讨论】:
我发现MONyog 对我的 mysql 服务器有很大帮助。
这是一个基于网络的系统,可以 24/7 全天候分析您的系统,并为您提供关于系统变量、缓存大小等更好值的合理建议......
它还具有内置的 mysqlsla 类型的慢查询分析器功能。
可惜它不是免费的。
MONyog- MySQL Monitor and Advisor 有我喜欢的新 UI,我最喜欢这些功能:
查找问题 SQL - 使用慢日志、一般日志、PROCESSLIST 和通过 PROXY
在严重情况下发出警报,例如 - 服务器已关闭、连接过多等。
定期监控自己的查询结果
复制监控
【讨论】: