文章目录 1、原题 2、题目解析 3、知识点 3.1、知识点1:Redo Log(重做日志) 3.1.1、Redo Log(重做日志) 3.1.2、innodb_log_file_size系统变量 3.1.3、优化InnoDB重做日志 4、总结
1、原题
1.1、英文原题
You have successfully provisioned the latest MySQL 5.7 database instance on a physical host, to be added to an existing farm for use in a modern, high volume, ACID-compliant, OLTP website, which servers hundreds of DML transactions per second. The default values of which two key variables do you change to ensure seamless operation of the database? A、Query Cache Size B、InnoDB Redo Log Size C、Sort Buffer Size D、Buffer Pool Size E、Key Buffer Size F、Binary Log Size
1.2、中文翻译
您已经在物理主机上成功地配置了最新的MySQL 5.7数据库实例,将其添加到现有的服务器场中,以便在现代、高容量、符合ACID的OLTP网站中使用,该网站每秒处理数百个DML事务。 为了确保数据库的无缝运行,您更改了哪两个关键变量的默认值? A、Query Cache Size B、InnoDB Redo Log Size C、Sort Buffer Size D、Buffer Pool Size E、Key Buffer Size F、Binary Log Size
1.3、答案
B、D
2、题目解析
2.1、题干解析
本题考察各种缓存、缓冲、日志大小设置对于性能的影响。
2.2、选项解析
Query Cache也不用于DML,而且不推荐使用,所以选项A错误。 因为是DML操作,所以Sort Buffer对此影响不大,所以选项C错误。 Key Buffer用于MyISAM, 而MyISAM不支持ACID的事务,所以选项E错误。 重做日志是在事务期间记录,在崩溃恢复期间用于纠正由不完整事务写入的数据。重做日志的大小会影响长事务的性能。一般来说,日志文件大小应该足够大,以便服务器能够平滑工作负载活动的高峰和低谷,这通常意味着有足够的重做日志空间来处理一个多小时的写入活动。这个值越大,缓冲池中需要的检查点刷新活动就越少,可以节省磁盘I/O。所以选项B是正确的。 InnoDB缓冲池会有大量脏数据缓冲在池内,如果太小,就会造成读写频繁,降低性能。所以选项D是正确的。
3、知识点
3.1、知识点1:Redo Log(重做日志)
3.1.1、Redo Log(重做日志)
重做日志是一个基于磁盘的数据结构,在崩溃恢复期间用于纠正由不完整事务写入的数据。在正常操作期间,重做日志对改变表数据的请求进行编码,这些请求来自SQL语句或低级别的API调用。在意外关机之前没有完成更新数据文件的修改,在初始化期间和接受连接之前会自动重放。 默认情况下,重做日志在磁盘上由两个名为ib_logfile0和ib_logfile1的文件物理表示。MySQL以循环方式向重做日志文件写入。重做日志中的数据是以受影响的记录来编码的;这些数据被统称为重做。数据通过重做日志的过程由一个不断增加的LSN值表示。 要改变InnoDB重做日志文件的数量或大小,请执行以下步骤。 停止MySQL服务器,并确保其关闭时没有错误。 编辑my.cnf以改变日志文件的配置。要改变日志文件的大小,配置innodb_log_file_size。要增加日志文件的数量,配置innodb_log_files_in_group。 再次启动MySQL服务器。 如果InnoDB检测到innodb_log_file_size与redo日志文件大小不同,它将写一个日志检查点,关闭并删除旧的日志文件,以要求的大小创建新的日志文件,并打开新的日志文件。
官方参考文档
3.1.2、innodb_log_file_size系统变量
innodb_log_file_size系统变量表示一个日志组中每个日志文件的大小,以字节为单位。日志文件的综合大小(innodb_log_file_size * innodb_log_files_in_group)不能超过一个略小于512GB的最大值。例如,一对255GB的日志文件,接近该限制,但不超过该限制。默认值是48MB。 一般来说,日志文件的组合大小应该足够大,以便服务器能够平滑工作负载活动的高峰和低谷,这通常意味着有足够的重做日志空间来处理一个多小时的写入活动。这个值越大,缓冲池中需要的检查点刷新活动就越少,可以节省磁盘I/O。但较大的日志文件也会使崩溃恢复更慢。
官方参考文档
3.1.3、优化InnoDB重做日志
重做日志遵循如下原则:
让你的重做日志文件很大,甚至和缓冲池一样大。当InnoDB把重做日志文件写满后,它必须在检查点中把缓冲池的修改内容写到磁盘上。小的重做日志文件导致许多不必要的磁盘写入。尽管历史上大的重做日志文件会造成冗长的恢复时间,但现在恢复的速度更快,你可以放心地使用大的重做日志文件。重做日志文件的大小和数量是通过innodb_log_file_size和innodb_log_files_in_group配置选项配置的。 考虑增加日志缓冲区的大小。一个大的日志缓冲区可以使大型事务在运行时不需要在事务提交前将日志写到磁盘上。因此,如果你有更新、插入或删除许多行的事务,使日志缓冲区更大可以节省磁盘I/O。日志缓冲区的大小是通过innodb_log_buffer_size配置选项配置的。 配置innodb_log_write_ahead_size配置选项,以避免 “写时读”。这个选项定义了重做日志的写头块大小。设置innodb_log_write_ahead_size以匹配操作系统或文件系统的缓存块大小。当重做日志块由于重做日志的写头块大小和操作系统或文件系统的缓存块大小不匹配而没有完全缓存到操作系统或文件系统时,就会发生 “随读随写”。
官方参考文档
4、总结
在事务期间,InnoDB会将当前事务日志不断写入Redo Log(重做日志),以便一旦崩溃可以纠正由不完整事务写入的数据。当InnoDB把重做日志文件写满后,它必须在检查点中把缓冲池的修改内容写到磁盘上。小的重做日志文件导致许多不必要的磁盘写入。所以应该让你的重做日志文件尽量大,甚至和缓冲池一样大。Redo Log的SIZE越大,缓冲池中需要的检查点刷新活动就越少,可以节省磁盘I/O。 要提高MySQL性能的一个重要举措,就是降低磁盘IO的频度。