原文地址:Mysql一些重要配置参数的学习与整理(三)
之前的Mysql一些重要配置参数的学习与整理(一)和Mysql一些重要配置参数的学习与整理(二)中,对于线上mysql服务器的一些配置参数进行了学习,不过参阅官方doc后对其中的一些参数的配置的理解不是很清晰,今天与同事进行了交流和沟通,都一些重要的配置交换了意见,本篇就对其中的一些疑问点,整理一下心得。
skip-external-locking作用
在Mysql Linux 的发行版中,默认存在一行skip-external-locking,它表示跳过外部锁定,与之相对,External-locking变量表示启用外 部锁定,用于多线程条件下对MyISAM数据表进行锁定,默认情况下mysql是禁用外部锁定的,在现实生产中,我们的业务环境是单服务器环境,不需要外 部锁定,所以将其禁用。
key_buffer_size 在InnoDB引擎时无效
在 现实的生产环境中,我们曾对业务库进行过升级,虽然我们的业务库使用的是InnoDB引擎,但是其中仍然存在几张遗留的使用MyISAM存储引擎的表,设 置这个参数也是为了提供对于这几张表的访问性能,用于这几张表的索引更好的处理读和多写操作。另外,在之前windows上安装mysql 5.5时,会默认产生几个不同生产环境的my.ini文件,这个参数的配置也参阅了其中的一些配置。
table_open_cache=64 设置是否过小
这个参数的设置最好根据现实生产环境进行设置,在mysql命令行通过show global status like 'open%_tables%',可以查到两个重要的参数,如下:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 81 |
| Opened_tables | 88 |
+---------------+-------+
对与大多数的服务器设置,建议参考一下公式:Open_tables / Opened_tables >= 0.85;Open_tables / table_open_cache <= 0.95
但是并不是设置table_open_cache越大越好,因为table_cache加大后,使得mysql对 SQL响应的速度更快了,不可避免的会产生更多的死锁(dead lock),这样反而使得数据库整个一套操作慢了下来,严重影响性能。所以平时维护中还是要根据库的实际情况去作出判断,找到最适合你维护的库的 table_open_cache值。
详请参阅:参数table_open_cache。
myisam_sort_buffer_size参数只对MyISAM引擎有效
在现实的生产环境中,虽然我们的业务库使用的是InnoDB引擎,但有多张业务表使用的是MyIsam引擎,需要这个参数,用于进行表恢复时使用的缓冲区的大小,也是参考了mysql 5.5的配置。
net_buffer_length默认为16K,设置为8K?
这个参数根据客户端connection 语句的长度有关,现实的业务并不繁杂,语句也比较简单,参考mysql 5.5的配置,设置net_buffer_length=8k,不过经过与同事讨论,决定使用默认值16K。
thread_cache_size设置为20的依据
这个参数的设置与max_connections有关,max_connections表示最大允许的并发客户端连接数,会影响在服务器上运行的线程数量,默认值是151,thread_cache_size 的设置,官方doc建议公式:8+(max_connections / 100),这与现实的业务也存在关系,当服务器并发很大时,需要修改max_connections的值以满足业务需要,在我们的现实业务 中,thread_cache_size设置为20较为合适。
innodb_flush_log_at_trx_commit 官方doc建设不要修改默认值
虽然mysql官方doc建议将innodb_flush_log_at_trx_commit设置为1,但在现实的业务中,客户对于业务性能的速度很高,默认为1表示,在每次事务提交的时候,InnoDB日志缓冲区的内容都会被写入到日志文件,并且日志文件会被刷新到磁盘。设置为2减少了刷新磁盘的操作,虽然在突然断点或系统崩溃时可能丢失事务数据,但是在业务允许范围内,相反修改此参数对于业务速度有很大的提升。
read_rnd_buffer_size增加order by查询效率
在What exactly is read_rnd_buffer_size中有了一点理解,其中提到了read_buffer_size,在三个方法优化MySQL数据库查询中大概的了解了这个参数的作用,当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变 量控制这一缓冲区的大小。如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。不过貌似这两个参数都是值针对于 MyIsam表的,在mysql安装目录my.ini中看到这样一句注释:Size of the buffer used for doing full table scans of MyISAM tables。对于这个参数的配置还需要再讨论。
InnoDB_thread_concurrency
具体的可以看这里