19.8 绩效顾问

本节介绍 Performance Advisors。

二进制日志使用超过磁盘缓存内存限制

当二进制日志使用超过二进制日志缓存内存限制时,它正在执行过多的磁盘操作。为了获得最佳性能,在二进制日志中移动的事务应该包含在二进制日志缓存中。

有关二进制日志和二进制日志缓存的更多信息,请参阅 二进制日志

默认频率00:05:00

默认自动关闭是否启用

数据库文件 I/O 全局摘要

sys.x$io_global_by_wait_by_latency 从视图中 按等待类型全局公开文件 I/O 的当前摘要 。

该顾问没有可配置的阈值,用于填充数据库文件 I/O报告的图形和表格。如果 Advisor 被禁用,报告会继续显示历史数据,但不会显示任何新数据。

检测到过多的磁盘临时表使用

如果构建临时表所需的空间超过 tmp_table_size或 ,MySQL 会在服务器目录max_heap_table_size中创建一个基于磁盘的表 。tmpdir此外,具有 TEXT 或 BLOB 列的表会自动放置在磁盘上。

出于性能原因,理想的做法是在内存中创建大多数临时表,而在磁盘上创建非常大的临时表。

默认频率00:05:00

默认自动关闭是否启用

锁定进程数过多

根据环境、存储引擎和其他因素,一个进程可能正在使用或访问另一个进程所需的资源(例如表或行),导致第二个进程在第一个进程释放资源之前无法继续. 在这种情况下,第二个进程处于锁定状态,直到资源被释放。如果许多进程处于锁定状态,这可能是与资源争用相关的严重问题的迹象,或者是长时间运行的会话没有在应该释放当前持有的锁时释放。

默认频率00:01:00

默认自动关闭是否启用

长时间运行的进程数量过多

大多数应用程序和数据库都旨在非常快速地执行查询。如果许多查询需要很长时间才能执行(超过几秒钟),则可能是出现问题的迹象。在这种情况下,可能需要调整或重写查询,或者添加索引以提高性能。在其他情况下,可能必须重新设计数据库模式。

默认频率00:01:00

默认自动关闭是否启用

过多的长时间运行的进程被锁定

大多数应用程序和数据库旨在非常快速地执行查询,并避免一个查询等待另一个查询释放对某些共享资源的锁定的资源争用。如果许多查询被锁定并且需要很长时间才能执行(超过几秒钟),则可能是性能问题和资源争用的迹象。在这种情况下,可能需要调整或重写查询,或者添加索引以提高性能。在其他情况下,可能必须重新设计数据库模式。

默认频率00:01:00

默认自动关闭是否启用

冲洗时间设置为非零值

如果flush_time设置为非零值,则每 flush_time 秒关闭所有表以释放资源并将未刷新的数据同步到磁盘。如果您的系统不可靠并且往往会锁定或经常重启,以这种方式强制更改表会降低性能,但可以减少表损坏或数据丢失的可能性。我们建议仅在 Windows 或资源最少的系统上使用此选项。

默认频率06:00:00

默认自动关闭是否启用

未有效使用索引

目标服务器似乎没有有效地使用索引。Handler_read_rnd_next和 一起的值 Handler_read_rnd反映了通过全表扫描读取的行数,与表示索引访问的 Handler 变量(例如 、 等)相比,它们的值 Handler_read_key较高 Handler_read_next。您应该检查您的表和查询以正确使用索引。

默认频率00:05:00

默认自动关闭是否启用

InnoDB 缓冲池写入可能是性能瓶颈

为了获得最佳性能,InnoDB 在将页面写入 InnoDB 缓冲池之前不必等待。

默认频率00:05:00

默认自动关闭启用

InnoDB 的 Flush 方法可能不是最优的

的不同值 innodb_flush_method会对 InnoDB 性能产生显着影响。fsync()在某些版本的 GNU/Linux 和 Unix 中,通过调用(InnoDB 默认使用)或其他类似方法将文件刷新到磁盘 可能会非常慢。如果您对数据库写入性能不满意,您可以尝试将innodb_flush_method参数设置为 O_DIRECTO_DSYNC

默认频率06:00:00

默认自动关闭是否启用

InnoDB 日志缓冲区在每个事务后刷新到磁盘

默认情况下,InnoDB 的日志缓冲区在每个事务提交时写出到日志文件,并对日志文件执行刷新到磁盘操作,这强制 ACID 合规性。在发生崩溃时,如果您可以承受损失一秒钟的交易价值,则可以通过设置 innodb_flush_log_at_trx_commit 为 0 或 2 来获得更好的性能。如果将值设置为 2,则只有操作系统崩溃或断电可以擦除交易的最后一秒。这在从服务器上非常有用,如果需要,可以从主服务器恢复丢失一秒的数据。

默认频率06:00:00

默认自动关闭启用

InnoDB 没有使用最新的文件格式

笔记

此顾问不会针对 MySQL 8 或更高版本进行评估。

InnoDB 支持压缩表(COMPRESSED 行格式)和更高效的 BLOB 处理(DYNAMIC行格式),但这两种功能都需要支持最新的文件格式(innodb_file_format=Barracuda)。这些功能还需要使用 ROW_FORMAT=[DYNAMIC|COMPRESSED]in CREATE TABLEALTER TABLE语句。

有关详细信息,请参阅 定义表的行格式

默认频率12:00:00

默认自动关闭是否启用

InnoDB 日志等待可能是性能瓶颈

为了获得最佳性能,InnoDB 在将 DML 活动写入 InnoDB 日志缓冲区之前不必等待。

默认频率00:05:00

默认自动关闭是否启用

MyISAM 并发插入设置可能不是最优的

MyISAM 使用表级锁定,当有许多并发 的INSERTandSELECT 语句时,这会对性能产生不利影响,因为INSERTs 会阻塞所有 SELECTs 直到 theINSERT 完成。但是,MyISAM 可以配置为允许 INSERTSELECT 语句在某些情况下并发运行。

  • 如果concurrent_insert设置为 1,默认值,或者AUTO从 MySQL 5.5.3 或更高版本开始,MySQL 允许 INSERTSELECT 语句为数据文件中间没有空闲块的 MyISAM 表并发运行。

  • 如果concurrent_insert设置为 2,在 MySQL 5.0.6 及更高版本中可用,或者 ALWAYS从 MySQL 5.5.3 或更高版本开始,MySQL 允许对所有 MyISAM 表进行并发插入,即使是那些有漏洞的表。对于有洞的表,如果另一个线程正在使用它,则在表的末尾插入新行。否则,MySQL 获取一个正常的写锁并将该行插入到洞中。

    设置concurrent_insert为 2 允许表格增长,即使中间有洞。这对于删除大块数据但继续发出许多 SELECTs 的应用程序来说可能很糟糕,从而有效地防止 INSERTs 填补漏洞。

默认频率06:00:00

默认自动关闭是否启用

未关闭的准备好的报表

准备好的语句可能会提高多次执行类似语句的应用程序的性能,这主要是因为查询只被解析一次。准备好的语句还可以减少网络流量,因为每次执行只需要发送参数数据而不是整个语句。

但是,准备好的语句需要时间来准备和消耗 MySQL 服务器中的内存,直到它们被关闭。

默认频率00:05:00

默认自动关闭是否启用

未有效使用准备好的语句

准备好的语句可能会提高多次执行类似语句的应用程序的性能,这主要是因为查询只被解析一次。准备好的语句还可以减少网络流量,因为每次执行只需要发送参数数据而不是整个语句。

但是,准备好的语句需要时间来准备和消耗 MySQL 服务器中的内存,直到它们被关闭,因此正确使用它们很重要。如果您只执行一条语句几次,那么创建准备好的语句的开销可能不值得。

默认频率00:05:00

默认自动关闭是否启用

查询缓存过度碎片化

笔记

此顾问不会针对 MySQL 8 或更高版本进行评估。

启用查询缓存可以显着提高SELECT跨多个连接执行相同查询的性能,返回相同的结果集。但是,如果用于查询缓存的内存碎片过多,性能可能会受到不利影响,导致服务器在从缓存中删除条目或搜索空闲块列表以寻找用于插入新查询的好块时暂停缓存。

默认频率00:05:00

默认自动关闭是否启用

表锁争用过度

如果与锁总数相比,必须等待锁的表操作的百分比很高,则性​​能可能会降低。当使用表级锁定存储引擎(例如 MyISAM)而不是行级锁定存储引擎时,可能会发生这种情况。

默认频率00:05:00

默认自动关闭是否启用

未启用线程缓存

与 MySQL 数据库服务器的每个连接都在其自己的线程中运行。线程创建需要时间,因此服务器可以将线程保留在其线程缓存中并在以后将其用于新连接,而不是在连接关闭时终止线程。

默认频率00:05:00

默认自动关闭是否启用

线程池停顿限制太低

thread_pool_stall_limit 变量使线程池能够处理长时间运行的语句。如果允许长时间运行的语句阻塞线程组,则分配给该组的所有其他连接都将被阻塞,并且在长时间运行的语句完成之前无法开始执行。在最坏的情况下,这可能需要数小时甚至数天。

thread_pool_stall_limit应选择 的值,以便将执行时间超过其值的语句视为停滞。停滞的语句会产生大量额外的开销,因为它们涉及额外的上下文切换,在某些情况下甚至需要额外的线程创建。另一方面,将thread_pool_stall_limit参数设置得太高意味着长时间运行的语句会阻塞一些短时间运行的语句,时间超过必要的时间。短等待值允许线程更快地启动。短值也能更好地避免死锁情况。长时间等待值对于包含长时间运行的语句的工作负载很有用,以避免在当前语句执行时启动太多新语句。

默认频率00:05:00

默认自动关闭是否启用

未启用线程池

从 MySQL 5.5.16 开始,MySQL 的商业发行版包括一个线程池插件,它提供了一种替代线程处理模型,旨在减少开销并提高性能。它实现了一个线程池,通过有效管理大量客户端连接的语句执行线程来提高服务器性能。

对于具有许多并发活动连接(通常多于机器内的 CPU 数量)的服务器,启用线程池插件可以提高性能。这使得服务器内主动执行线程的数量减少,通常会减少对锁和资源的争用,同时仍然保持来自应用程序的非常高的连接数。

默认频率00:05:00

默认自动关闭是否启用

运行的并发查询过多

太多的活动查询表明服务器上有严重的负载,并且可能是锁争用或未优化的 SQL 查询的迹象。

默认频率00:05:00

默认自动关闭是否启用