mysql5.7性能提升一百倍调优宝典( 四 )

如果不配的后果:

默认的为256k
配置实例:
join_buffer_size = 16M
13)tmp_table_size
推荐设置:
67108864
作用:
  1. 如果是128gb内存的服务器,我建议是在my.cnf中设成64M
  2. 通过设置tmp_table_size选项来增加一张临时表的大小,例如做高级GROUP BY操作生成的临时表 。默认系统为32M,如果当你的临时表越来越多加在一起超过了这个值,那么mysql会在系统磁盘上创建,这个值不是越多越好,也没有一个合适的值 。一开始的建议为>64M,然后在运行时我们通过以下公式来做临时调优,
  3. show global status like 'created_tmp%';
  4. 把得到的结果中的:(Created_tmp_disk_tables / Created_tmp_tables) * 100% 如果<=25%为最佳值 。注意了,在生产时热设定时一定要用类似以下算法:
  5. set global tmp_table_size=64*1024*1024而不是set global tmp_table_size=64M 。
如果不配的后果:
默认为32M
配置实例:
tmp_table_size = 67108864
14)tmpdir
这块参数可以让运维给到,放到大空间里就行了,没什么太敏感的 。
15)max_allowed_packet
推荐设置:
134217728
作用:
  1. 如果你经常在应用层碰到了:Got a packet bigger than'max_allowed_packet' bytes,这时你可以使用
  2. show variables like '%max_allowed_packet%';来查看这个值,这个值没有合适,一般如:用客户端导入数据的时候,遇到 错误代码: 1153 - Got a packet bigger than 'max_allowed_packet' bytes 终止了数据导入 。这样的场景下,当MySQL客户端或mysqld服务器收到大于max_allowed_packet字节的信息包时,将发出“信息包过大”错误,并关闭连接 。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与MySQL服务器的连接”错误 。
  3. 客户端和服务器均有自己的max_allowed_packet变量,因此,如你打算处理大的信息包,必须增加客户端和服务器上的该变量 。一般情况下,服务器默认max-allowed-packet为1MB,可以通过在交换机上抓包或者是图形化分析来抓返回结果判断 。一般推荐在128gb内存下设置的置为128M.也可以在运行时动态调整:set global max_allowed_packet = 128*1024*1024
如果不配的后果:
1M
配置实例:
max_allowed_packet = 134217728
16)sql_mode
不需要去设置,使用默认的,这块和性能无关 。我们的中台中的sql如果碰到有sql报错,因该是在测试环境上就已经报了,它的作用是用来约束你sql的写法的,如果是一个从头开始开发的应用,我们比如说约束好都是ansi sql写法,对于一个产品,不要去做这种画蛇添足的做法 。
17)interactive_timeout
推荐设置:
600
作用:
  1. 单位为s,系统默认为:28800s即8小时 。如果这2个值太大,你会发觉在mysql中有大量sleep的连接,这些连接又被称为:僵尸连接,僵尸连接一多你真正要用的时候就会抛:too many connection这样的错,因此对于长久不用的连接,我们一般要使用“踢出机制”,多久对于一个活动累的sql进行踢呢?我们说如果有一个长事务,它要执行1小时,我不知道这是不是属于正常?当然如果你设了太短,说1分钟就把它踢了,还真不一定踢的对,按照我们在oracle中设置的best practice我们都会把它放到10分钟 。你有一条sql连着,10分钟不用,我就把它踢了,这也算正常 。但是在高并发的场景下这个timeout会缩短至3-5分钟,这就是为什么我提倡我们的非报表即时类查询需要优化到sql的运行时间不超过300ms的原因,因为在高并发场景下,超过500ms的sql都已经很夸张了 。保守点我觉得可以设成10分钏,在应用端由其通过jdbc连接数据库的,做的好的应用都会在jdbc里有一个autoconnect参数,这个autoconnect参数就要和mysql中的wait_timeout来做匹配了 。同时在应用端要有相应的validate sql一类的操作来keep alived 。不过我更推荐使用”连接池内连接的生存周期(idleConnectionTestPeriod)”来做设置,把这个置设成<mysql内的这两个值将会是最好,同时,idleConnectionTestPeriod会使用到异步的方式去做超时check 。如c3p0中的:idleConnectionTestPeriod和testConnectionOnCheckin相当可靠
  2. interactive_timeout:交互式连接超时时间(mysql工具、mysqldump等)
  3. wait_timeout:非交互式连接超时时间,默认的连接mysql api程序,jdbc连接数据库等


    推荐阅读