本节介绍 Performance Advisors。
当二进制日志使用超过二进制日志缓存内存限制时,它正在执行过多的磁盘操作。为了获得最佳性能,在二进制日志中移动的事务应该包含在二进制日志缓存中。
有关二进制日志和二进制日志缓存的更多信息,请参阅 二进制日志。
默认频率00:05:00
默认自动关闭是否启用
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_flush_method
会对 InnoDB 性能产生显着影响。fsync()
在某些版本的 GNU/Linux 和 Unix 中,通过调用(InnoDB 默认使用)或其他类似方法将文件刷新到磁盘
可能会非常慢。如果您对数据库写入性能不满意,您可以尝试将innodb_flush_method
参数设置为
O_DIRECT
或O_DSYNC
。
默认频率06:00:00
默认自动关闭是否启用
默认情况下,InnoDB 的日志缓冲区在每个事务提交时写出到日志文件,并对日志文件执行刷新到磁盘操作,这强制 ACID 合规性。在发生崩溃时,如果您可以承受损失一秒钟的交易价值,则可以通过设置
innodb_flush_log_at_trx_commit
为 0 或 2 来获得更好的性能。如果将值设置为 2,则只有操作系统崩溃或断电可以擦除交易的最后一秒。这在从服务器上非常有用,如果需要,可以从主服务器恢复丢失一秒的数据。
默认频率06:00:00
默认自动关闭启用是
此顾问不会针对 MySQL 8 或更高版本进行评估。
InnoDB 支持压缩表(COMPRESSED
行格式)和更高效的 BLOB 处理(DYNAMIC
行格式),但这两种功能都需要支持最新的文件格式(innodb_file_format=Barracuda
)。这些功能还需要使用
ROW_FORMAT=[DYNAMIC|COMPRESSED]
in
CREATE TABLE
和ALTER
TABLE
语句。
有关详细信息,请参阅 定义表的行格式。
默认频率12:00:00
默认自动关闭是否启用
MyISAM 使用表级锁定,当有许多并发
的INSERT
andSELECT
语句时,这会对性能产生不利影响,因为INSERT
s 会阻塞所有
SELECT
s 直到 theINSERT
完成。但是,MyISAM 可以配置为允许
INSERT
和SELECT
语句在某些情况下并发运行。
如果
concurrent_insert
设置为 1,默认值,或者AUTO
从 MySQL 5.5.3 或更高版本开始,MySQL 允许INSERT
和SELECT
语句为数据文件中间没有空闲块的 MyISAM 表并发运行。如果
concurrent_insert
设置为 2,在 MySQL 5.0.6 及更高版本中可用,或者ALWAYS
从 MySQL 5.5.3 或更高版本开始,MySQL 允许对所有 MyISAM 表进行并发插入,即使是那些有漏洞的表。对于有洞的表,如果另一个线程正在使用它,则在表的末尾插入新行。否则,MySQL 获取一个正常的写锁并将该行插入到洞中。设置
concurrent_insert
为 2 允许表格增长,即使中间有洞。这对于删除大块数据但继续发出许多SELECT
s 的应用程序来说可能很糟糕,从而有效地防止INSERT
s 填补漏洞。
默认频率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
默认自动关闭是否启用