mysql知识盘点【肆】_调优参数

本文内容整理自《Mysql运维内参》第26章,本书值得一看,即使是开发同学。链接如下:





genera_log


建议在数据库正常服务时,将这个参数设置为关闭状态,因为它会记录提到MysQL的一切东西,既浪费磁盘又影响效率。同时它又是分析问题的利器,如果觉得数据库有莫名的访问或SQL, 可以把它打开,截取一段时间的日志,以帮助定位问题。



query_cache_size


Query Cache是用来缓存SQL语句文本和对应查询结果的缓存空间。如果相应的表没有变化,那么下次再碰到完全一致的SQL的时候,则跳过一切解析和查询,直接返回结果。这对某些情况是适合的,但是如果表变化非常频繁,SQL也是动态生成的,则由于要不断更新cache中的内容,并且这个时候锁粒度非常大,反而会成为瓶颈。所以很多情况下,会关掉这个选项,方法是设置此参数为0。


sort_buffer_size


MySQL在排序的时候,如果用不到索引就会在内部临时进行排序,这时候会用到排序的buffer。如果这个参数值过小的话,排序过程中会把结果写入到物理磁盘,严重影响效率。但是,这是一个session级变量,也就是说每个session在用到它的时候,都会申请一块这么大的内存,所以如果太大的话,又很可能会耗尽物理内存,导致服务器OOM。在设置它的大小时,一定要根据自己的实际情况,灵活设置。类似的另一个参数是 join_buffer_size,是在join无法用到索引的时候用到的buffer,也需要灵活设置。


tmp_table_size


在Group By或Distinct的时候,如果SQL语句用不到索引,就会使用系统内部临时表记录中间状态。如果tmp_table_size不够大,则MySQL会自动使用物理磁盘,这会对查询性能造成很大的影响。增加此参数可以降低这种情况发生的概率。


innodb_buffer_pool_size


InnoDB最重要的缓存,用来缓存InnoDB索引页面、undo页面及其他一些辅助数据。它的大小是影响性能的重要因素,基本上各种文档都会要求在内存允许的情况下尽可能地配置大一些,官方则建议配置为物理内存的50%~75%。


innodb_buffer_pool_instances


通过这个参数,把原来一整块Buffer Pool分割为多块内存空间,每个空间独立管理自己的空闲链表、刷新链表、LRU及其他数据结构。这大大增加了并发性,能更有效地利用缓存。


innodb_log_file_size和innodb_log_files_in_group


这两个参数结合,决定了REDO空间的大小。REDO空间越大,可以存储的增量更新日志越大,有效降低Buffer pool 脏页面被淘汰的速度,同时减少了checkpoint的次数,降低磁盘IO置换率,从而提升数据库的写入效率。不过也有可能会导致数据库异常退出时,恢复时间被拉长。


innodb_old_blocks_pct和innodb_old_blocks_time


这两个参数控制Buffer Pool中缓存数据的过期和移动行为,二者结合设置,可以优化一些全表扫描带来的大规模更新Buffer等问题。


innodb_numa_interleave


MySQL服务器很多时候会出现内存被交换到SWAP分区的情况,这时性能就会急剧下降。但是当我们去查看服务情况的时候,往往会发现实际上操作系统还有很多空闲内存。在MysQL 5.7.9之后,通过这个参数可以避免这个问题。MySQL在分配内存的时候,会把NUMA的策略设置为MPOL_INTERLEAVE。当然,这需要在支持NUMA的系统上编译MySQL才行。


innodb_autoinc_lock_node


在InnoDB有自增列的情况下,在插入数据的时候,会自动产生自增值,这个参数是控制自增值生成的方式。目前有三个选项:0、1、2。其实这是个枚举,真正的含义是:"traditional", "consecutive"和"interleaved"。使用2即"interleaved",这样在INSERT数据的时候,不会用到表级的AUTO-INC锁,避免AUTO-INC的死锁问题,在INSERT…SELECT的场景下会极大地提升性能。在做普通INSERT的时候,也会提升并发执行的效率。


innodb_flush_method


InnoDB刷数据和日志到磁盘文件的方式,默认为NULL,但其实如果是在类UNIX系统上,默认为fsync,在windows系统上默认为async_unbuffered。这里要说的是,它还有个可能的值是O_DIRECT, 在使用SSD或PCIE类型的存储时,可以设置为O_DIRECT, 底层调用directio(), 直接修改写入磁盘,以提升性能。


innodb_doublewrite


关于InnoDB的两次写,之前也详细介绍过其原理。这里要强调的是如果底层存储是支持原子写的,则可以关闭两次写,以提升效率。这跟上面的innodb_flush_method是一样的。


innodb_io_capacity


之前说过,InnoDB有后台线程在不断做Flush操作,影响这个操作频率的就是innodb_io_capacity这个参数,如果碰到系统因为后台Flush操作而产生周期性性能降低的情况,特别是在使用SSD设备的时候,可以适当提高这个参数的值,以加速Flush的频率。


innodb_thread_concurrency


在并发量大的实例上,增加这个值,可以降低InnoDB在并发线程之间切换的花销,以增加系统的并发吞吐量。


innodb_flush_log_at_trx_commit


InnoDB刷日志文件的方式,之前已经详细介绍过了。 在0、1、2的选型中,0性能最好,但最不安全,不推荐。1最安全,但性能最差,如果使用的磁盘足够好,可以弥补性能损失的话,还是建议为1, 否则,可以根据实际情况选择性地设置为2。


sync_binlog


MySQL同步Binlog到磁盘的方式,之前也有过详细介绍。1最安全,但性能最差。0性能最好,但最不安全。如果能在物理磁盘或架构上做出弥补,还是建议设置为1。


binlog_format


MysQL日志格式,从MysQL 5.7.7之后,官方就默认为Row了 。这也是在很多场景下都建议的选项。


binlog_order_commits


事务在提交的时候写入Binlog的顺序。这是把双刀剑,如果打开, 可以保证事务都以相同的顺序写入二进制文件,如果关闭则可以提升性能。需要根据实际情况决定。


tx_isolation


设置MySQL隔离级别,READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE这四种级別越来越严格,但性能也越来越差。在MySQL中椎荐与binlog_format结合设置,推荐隔离级别设置为READ COMMITTED,这在保证性能的前提下,同时设置binlog_format=ROW,确保通过Binlog同步数据主从库的一致
性,兼顾到安全,满足绝大多数业务的需求。


slave_parallel_workers


在进行多线程复制的时候,如果设置此参数为非零值,则可以打开多线程并发执行回放日志的操作,以提升Slave的同步性能。


系列文章

mysql知识盘点【壹】_SQL优化

mysql知识盘点【贰】_InnoDB引擎索引

mysql知识盘点【叁】_主从复制


猜你喜欢

转载自blog.csdn.net/xinzun/article/details/80095194
今日推荐