如果您遵循数据库设计和SQL操作调优技术的最佳实践,但由于磁盘I/O活动较多,数据库仍然很慢,请考虑这些磁盘I/O优化。如果Unix前
工具或Windows任务管理器显示您的工作负载的CPU使用率低于70%,您的工作负载可能是磁盘绑定的。
增加缓冲池大小
中缓存表数据时
InnoDB
缓冲池,它可以被查询重复访问,而不需要任何磁盘I/O。属性指定缓冲池的大小通过innodb_buffer_pool_size
选择。这个内存区域非常重要,通常建议通过innodb_buffer_pool_size
配置为系统内存的50%到75%。欲了解更多信息,章节8.12.4.1,“MySQL如何使用内存”.调整冲洗方法
在某些版本的GNU/Linux和Unix中,使用Unix
fsync ()
电话(InnoDB
默认使用)和类似的方法非常慢。如果数据库写入性能存在问题,请使用innodb_flush_method
参数设置为O_DSYNC
.在Linux上使用本机AIO的noop或deadline I/O调度器
InnoDB
使用Linux上的异步I/O子系统(本机AIO)对数据文件页执行预读和写请求。控件控制此行为innodb_use_native_aio
配置选项,默认启用。对于本机AIO, I/O调度器的类型对I/O性能的影响更大。通常,建议使用noop和deadline I/O调度器。执行基准测试,以确定哪个I/O调度器为您的工作负载和环境提供了最佳结果。有关更多信息,请参见第14.8.7节“在Linux上使用异步I/O”.对于x86_64架构,在Solaris 10上使用直接I/O
当使用
InnoDB
存储引擎在Solaris 10上的x86_64架构(AMD Opteron),使用直接I/OInnoDB
相关文件,以避免降级InnoDB
的性能。对用于存储的整个UFS文件系统使用直接I/OInnoDB
相关文件,使用forcedirectio
选择;看到mount_ufs(1米)
.(Solaris 10/x86_64上的默认值是不使用此选项。)将直接I/O仅应用于InnoDB
文件操作而不是整个文件系统,设置innodb_flush_method = O_DIRECT
.有了这个设置,InnoDB
调用译:()
而不是fcntl ()
用于数据文件的I/O(不用于日志文件的I/O)。对于Solaris 2.6或更高版本的数据和日志文件使用原始存储
当使用
InnoDB
存储引擎用的很大通过innodb_buffer_pool_size
在任何Solaris 2.6及以上版本和任何平台(sparc/x86/x64/amd64)上执行基准测试InnoDB
数据文件和日志文件在原始设备或单独的直接I/O UFS文件系统上,使用forcedirectio
挂载选项,如前所述。(使用mount选项而不是设置是必要的innodb_flush_method
如果你想直接I/O日志文件。)Veritas文件系统VxFS的用户应该使用convosync =直接
挂载选项。不放置其他MySQL数据文件,如
MyISAM
表,在一个直接I/O文件系统。可执行文件或库不得被放置在直接I/O文件系统上。使用额外的存储设备
可以使用其他存储设备来设置RAID配置。相关信息请参见第8.12.2节“优化磁盘I/O”.
另外,
InnoDB
表空间数据文件和日志文件可以放置在不同的物理磁盘上。欲了解更多信息,请参阅以下部分:考虑非旋转存储
非旋转存储通常为随机I/O操作提供更好的性能;以及用于顺序I/O操作的旋转存储。当在旋转和非旋转存储设备上分布数据和日志文件时,请考虑主要在每个文件上执行的I/O操作类型。
随机面向I/ o的文件通常包括file-per-table而且一般的表空间数据文件,撤消表空间文件,临时表空间文件。面向I/ o的顺序文件包括
InnoDB
系统表空间档案(由于doublewrite缓冲而且改变缓冲)和日志文件,例如二进制日志文件和重做日志文件。使用非旋转存储时,检查以下配置选项的设置:
的
crc32
Option使用更快的校验和算法,推荐用于快速存储系统。优化存储设备的I/O。对于非旋转存储或混合使用旋转和非旋转存储禁用它。
对于低端的非旋转存储设备,默认设置为200就足够了。对于高端的总线连接设备,可以考虑更高的设置,例如1000。
缺省值2000用于使用非旋转存储的工作负载。对于高端总线连接的非旋转存储设备,请考虑设置较高的值,例如2500。
如果重做日志位于非循环存储上,请考虑禁用此选项以减少日志记录。看到禁用压缩页面的日志记录.
如果重做日志位于非旋转存储上,则配置此选项以最大化缓存和写入组合。
考虑使用与磁盘内部扇区大小相匹配的页大小。早期SSD设备的扇区大小通常为4KB。一些较新的设备扇区大小为16KB。默认的
InnoDB
页面大小为16KB。保持页面大小接近存储设备块大小可以最小化重写到磁盘的未更改数据量。如果二进制日志在非旋转存储上,并且所有表都有主键,请考虑将此选项设置为
最小的
减少伐木。
确保您的操作系统启用了TRIM支持。默认情况下,它通常是启用的。
增加I/O容量以避免积压
如果吞吐量周期性下降,因为
InnoDB
检查点操作时,考虑增加值innodb_io_capacity
配置选项。数值越高,频率越高冲洗,避免了可能导致吞吐量下降的工作积压。如果刷新不落后,则降低I/O容量
如果系统没有落后
InnoDB
冲洗操作时,考虑降低值innodb_io_capacity
配置选项。通常情况下,您可以将这个选项值保持得尽可能低,但又不能低到导致前面提到的吞吐量周期性下降的程度。在一个可以降低选项值的典型场景中,您可能会在输出中看到这样的组合显示引擎innodb状态
:历史名单长度低,在几千以下。
插入缓冲区在插入行的附近合并。
在缓冲池中修改的页面始终低于
innodb_max_dirty_pages_pct
缓冲池的。(在服务器不进行批量插入时进行测量;在批量插入期间,修改的页面百分比显著上升是正常的。)日志序列号-最后一个检查点
是小于7/8还是理想情况下小于总尺寸的6/8InnoDB
日志文件.
在Fusion-io设备上存放系统表空间文件
通过存储系统表空间文件,您可以利用doublewrite缓冲区相关的I/O优化(”ibdata文件”)安装在支持原子写操作的Fusion-io设备上。在这种情况下,doublewrite缓冲(
innodb_doublewrite
)自动禁用,所有数据文件使用Fusion-io原子写。该特性仅在Fusion-io硬件上支持,且仅在Linux下的Fusion-io NVMFS上启用。为了充分利用这一特性,一个innodb_flush_method
设置O_DIRECT
建议。请注意由于doublewrite缓冲区设置是全局的,因此对于驻留在非fusion -io硬件上的数据文件也禁用doublewrite缓冲区。
当使用
InnoDB
表格压缩功能,图像重新压缩页面都被写入重做日志当对压缩数据进行更改时。此行为由innodb_log_compressed_pages
的不同版本时,该选项默认启用,以防止可能发生的损坏zlib
恢复时使用压缩算法。如果你确定zlib
版本不可更改,禁用innodb_log_compressed_pages
为修改压缩数据的工作负载减少重做日志的生成。