|
| 1 | +# MySQL性能调优 |
| 2 | + |
| 3 | +欢迎来到 MySQL 性能调优的世界。这是一个世界,有时可以像它占主导地位的黑魔法和运气,但希望这本书可以帮助你以结构化的方式工作,有条不紊地工作的方式,以更好的表现。 |
| 4 | + |
| 5 | +本章通过讨论整个堆栈以及监视和基于数据的操作的重要性向您介绍 MySQL 性能调优。由于本书主要讨论查询,因此在结束本章之前将回顾查询的生命周期。 |
| 6 | + |
| 7 | +*如果您需要一个测试实例,无论是阅读本书时,还是为了处理工作中的问题,云都可以是你的朋友。它允许您快速启动测试实例。如果您只需要一个小实例,例如,在本书中探索示例,您甚至可以使用免费实例,例如通过 Oracle 云的免费套餐(仍然需要注册和信用卡):https://mysql.wisborg.dk/oracle_cloude_free_tier.* |
| 8 | + |
| 9 | +## 考虑整个堆栈 |
| 10 | + |
| 11 | +调查性能问题时,必须考虑系统的所有部分,从最终用户到应用程序到 MySQL。当有人报告应用程序速度很慢,并且您知道 MySQL 是应用程序的核心部分时,很容易得出"MySQL 速度慢"的结论。这会排除造成业绩不佳的一系列潜在原因。 |
| 12 | + |
| 13 | +当应用程序需要查询结果或需要在 MySQL 中存储数据时,它会通过网络将请求发送到 MySQL,为了执行请求,MySQL 与操作系统交互并使用主机资源(如内存和磁盘)。一旦请求的结果准备就绪,它将通过网络将通信回应用程序。图 1-1 说明了这一点。 |
| 14 | + |
| 15 | +补充图1-1 |
| 16 | + |
| 17 | +金字塔是一个非常简化的图片,它把应用程序以外的一切都删除,而应用程序又可能与用户通信并使用自己的资源。 网络通信还涉及主机和操作系统。 |
| 18 | + |
| 19 | +为了说明图层如何交互,请考虑一个实际示例。一个 MySQLuser 报告了 MySQL 遇到临时摊位的问题。在Linux上使用 perf 工具的一项调查显示,之所以出现停滞,是因为内存非常分散,主要是由 I/O 缓存引起的。当您通过网络提交数据时,Linux 会请求连续的内存部分(使用 kmalloc),但由于内存严重碎片,Linux 必须先对内存进行碎片整理(压缩)。虽然此压缩发生,但包括 MySQL 在内的所有内容都停滞不前,并且在最恶劣的情况下,它最多需要一分钟(服务器有大量的内存可用于 I/O 缓存),因此造成了严重影响。在这种情况下,将 MySQL 配置更改为使用直接 I/O 可以解决此问题。虽然这是一个极端的情况,但值得记住的是,互动会导致令人惊讶的拥堵点。 |
| 20 | + |
| 21 | +一个更直接的实际示例是使用框架来生成查询的应用程序。框架中有一个错误,这意味着对大型表的查询省略了一个在位子句。这意味着一个级联问题列表,包括应用程序重试查询,并在几秒钟内完成 50 个查询副本(因为数据最终被读取到缓冲池中,使最后一个查询执行速度比第一个查询快得多),并发送大量数据回应用程序,导致网络过载和应用程序内存耗尽。 |
| 22 | + |
| 23 | +本书重点介绍 MySQL 和影响查询的各个方面,但不要忘记系统最集中。这包括监视系统时。 |
| 24 | + |
| 25 | +## 监控方式 |
| 26 | + |
| 27 | +如果你只从阅读这本书中拿出一件事,那么让监控对于维持一个健康的系统至关重要。你所做的一切都应该围绕着监控。在某些情况下,通过专用的监视解决方案进行监视可提供您需要的所有数据,在其他情况下,您需要进行临时观察。 |
| 28 | + |
| 29 | +您的监视应使用多种信息来源。 这些包括但不限于 |
| 30 | + |
| 31 | +- 性能模式,包括从低级互斥量到查询和事务度量的信息。这是用于查询性能调整的最重要的信息源。 sys模式提供了一个方便的界面,特别是用于即席查询。 |
| 32 | +- 信息模式,其中包括模式信息,InnoDB统计信息等。 |
| 33 | +- SHOW语句,例如,包含来自InnoDB的信息以及详细的引擎统计信息。 |
| 34 | +- 慢查询日志,可以记录符合某些条件的查询,例如花费比预定义阈值更长的时间。 |
| 35 | +- EXPLAIN语句返回查询执行计划。这是一个无价的工具,用于调查为什么由于缺少索引,查询以次优方式编写或MySQL选择次优方式执行查询而导致查询无法正常运行的原因。 EXPLAIN语句在调查特定查询时通常以临时方式使用。 |
| 36 | +- 操作系统指标,例如磁盘利用率,内存利用率和网络利用率。不要忘记简单的指标(例如可用存储量),因为存储空间不足会导致中断。 |
| 37 | + |
| 38 | + |
| 39 | + |
| 40 | +这些信息来源在本书中都有讨论和使用。 |
| 41 | + |
| 42 | +在整个性能调优过程中使用监视时,您可以验证问题是什么,找到原因,并证明您已经解决了问题。在处理解决方案时,了解查询的生命周期也很有用。 |
| 43 | + |
| 44 | +## 查询的生命周期 |
| 45 | + |
| 46 | +执行查询时,它会在查询结果回到应用程序或客户端之前执行几个步骤。每个步骤都需要时间,而且本身可能是由多个子部分组成的复杂操作。 |
| 47 | + |
| 48 | +查询生命周期的简化概述见图 1-2。在实践中,涉及的步骤更多,如果你安装插件,如查询重新编写,它会添加自己的步骤。但是,该图确实涵盖了基本步骤,稍后将更详细地介绍几个步骤 |
| 49 | + |
| 50 | +补充图 1-2 |
| 51 | + |
| 52 | +MySQL 服务器可分为两层。例如,SQL 层处理连接并准备语句以执行。实际数据由存储引擎存储,这些引擎作为插件实现,因此相对容易实现处理数据的不同方法。本书中考虑的主要存储引擎是 InnoDB,它是完全可操作的,并且对高并发工作负载具有很好的支持。另一个存储引擎的示例是 NDBCluster,它也是事务性的,用作MySQL NDB群集的一部分。 |
| 53 | + |
| 54 | +当应用程序需要执行查询时,第一件事是创建连接(这不包括在图中,因为连接可以重复使用以执行更多查询)。当查询到达时,MySQL 将分析它。这包括将查询拆分为令牌,因此查询类型是已知的,并且查询所需的表和列列表。在下一步中,需要此列表,检查用户是否具有执行查询所需的权限。 |
| 55 | + |
| 56 | +此时,查询已达到确定如何执行查询的重要步骤。这是优化器的工作,涉及重写查询以及确定访问表的顺序以及要使用的索引。 |
| 57 | + |
| 58 | +实际执行步骤包括从存储引擎层请求数据。存储引擎本身可能很复杂。对于 InnoDB,它包括用于缓存数据和索引的缓冲池、重做和撤消日志、其他缓冲区以及表空间文件。如果查询返回行,则这些行通过 SQLlayer 从存储引擎发送回应用程序。 |
| 59 | + |
| 60 | +在查询调优中,最重要的步骤是优化器和执行步骤,包括存储引擎。本书中大部分信息直接或间接地与这三部分有关。 |
| 61 | + |
| 62 | +## 概要 |
| 63 | + |
| 64 | +本章触及了性能调优的表面,并让你为本书的其余部分的旅程做好准备。关键要点是,您需要考虑从最终用户到主机和操作系统的低级详细信息,监视在性能调整中是绝对必须的。执行查询包括每个步骤,其中优化器和执行步骤是您将在本书中学到的最多步骤。 |
| 65 | + |
| 66 | +下一章将仔细研究一种有助于解决性能问题的方法。 |
0 commit comments