新参数说明和设置,这里说下5.6比较重要的参数,以及5.5到5.6默认值有过变化的参数。

MySQL Server参数:

1,optimizer_switch:优化器选项。

Variable_name: optimizer_switch
        Value: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on

关于优化器的改进可以参考下面这些文章:

ICP  :http://blog.itpub.net/22664653/viewspace-1678779/

MRR:http://blog.itpub.net/22664653/viewspace-1673682/

BKA:http://blog.itpub.net/22664653/viewspace-1715511/

BNL:http://blog.itpub.net/22664653/viewspace-1692317/

2,thread_handling(Thread pool)线程调度方式相关参数,默认one-thread-per-connection。详细说明可以看percona的官方文档

MySQL常用(目前线上使用)的线程调度方式是one-thread-per-connection(每连接一个线程),server为每一个连接创建一个线程来服务,连接断开后,这个线程进入thread_cache或者直接退出(取决于thread_cache设置及系统当前已经cache的线程数目)。比较适合活跃的长连接的应用场景,而在大量短连接或者高并发情况下,one-thread-per-connection需要创建/调度大量的线程,产生较高的的context-switch代价,从而使得系统性能下降。Threadpool是提供一种线程代理的模型执行每个连接的语句。而MySQL内部维护一个可能接受的线程总数,减少线程太多在CPU切换等方面的压力和开销。通过thread_handling=pool-of-threads开启thread pool功能:threadpool中worker线程处理单位为一个sql,而不是one-thread-per-connection对应的一个连接;当worker线程处理完A连接发送来的一个sql后,A连接没有立刻发送第二条sql,worker线程会去服务其它连接发送来的sql,因此worker线程工作效率更高,系统需要的线程数也更少。启用Thread Pool后,想要终止某个查询的话,要这么写KILL QUERY connection_id,而不是写成 KILL connection_id,否则就会导致整个连接被KILL。 

MySQL 5.6比较重要的参数,以及5.5到5.6默认值有过变化的参数
threadpool相关参数
root@(none) 05:33:27>show global variables like '%thread_pool%';
+-------------------------------+--------------+
| Variable_name                 | Value        |
+-------------------------------+--------------+
| thread_pool_high_prio_mode    | transactions |
| thread_pool_high_prio_tickets | 4294967295   |
| thread_pool_idle_timeout      | 60           |
| thread_pool_max_threads       | 100000       |
| thread_pool_oversubscribe     | 3            |
| thread_pool_size              | 24           |
| thread_pool_stall_limit       | 500          |
+-------------------------------+--------------+
7 rows in set (0.00 sec)
thread_pool_high_prio_mode
有三个取值:transactions / statements / none
transactions(default): 使用优先队列和普通队列,对于事务已经开启的statement,放到优先队列中,否则放到普通队列中
statements:只使用优先队列
none: 只是用普通队列,本质上和statements相同,都是只是用一个队列

thread_pool_high_prio_tickets
取值0~4294967295,当开启了优先队列模式后(thread_pool_high_prio_mode=transactions),每个连接最多允许thread_pool_high_prio_tickets次被放到优先队列中,之后放到普通队列中,默认为4294967295

thread_pool_idle_timeout
worker线程最大空闲时间,单位为秒,超过限制后会退出,默认60

thread_pool_max_threads
threadpool中最大线程数目,所有group中worker线程总数超过该限制后不能继续创建更多线程,默认100000

thread_pool_oversubscribe
一个group中线程数过载限制,当一个group中线程数超过次限制后,继续创建worker线程会被延迟,默认3

thread_pool_size

threadpool中group数量,默认为cpu核心数,server启动时自动计算

thread_pool_stall_limit
timer线程检测间隔,单位为毫秒,默认500
MySQL 5.6比较重要的参数,以及5.5到5.6默认值有过变化的参数

关于具体的信息可以参考下面的文章:

http://www.mysqlsupport.cn/percona-thread-pool/

http://www.gpfeng.com/?p=540&utm_source=tuicool&utm_medium=referral

http://imysql.cn/2014/07/02/percona-thread-pool-benchmark-testing.shtml

3,...

 

InnoDB 参数:

1,binlog_checksum全局动态变量。5.6.2引入,5.6.5之前默认是NONE,5.6.6之后默认是CRC32。

开启该参数,这个变量将导致主为每个二进制日志的事件进行写校验,提高了安全性。关闭该参数的时候,是通过二进制日志事件的长度来验证的。需要注意的是:因为5.6.2之前没有这个参数,要是主从版本不一致(M(5.6.6),S(5.5.x))会导致复制出错,需要显性的在高版本上添加:binlog_checksum=NONE;或则执行:set global binlog_checksum = none。

2,innodb_autoextend_increment:全局动态变量。5.6.6之后默认大小是64M,之前是8M。

该参数是在当共享表空间满了的时候自动扩展的一个大小,如果表是独享表空间(innodb_file_per_table),该变量不会影响其创建大小。

3,innodb_buffer_pool_instances:全局变量。 5.6.6之后默认改成了8,之前是1。

该参数来增加InnoDB_Buffer_Pool实例的个数(BP>1G),并使用哈希函数将读取缓存的数据页随机分配到一个缓冲池里面。每个缓冲区实例分别管理着自己的free list、flush list和LRU。提升了buffer pool的利用率。要是单个InnoDB_Buffer_Pool缓冲池实例,当达到好几十GB时,如果某个线程正在更新缓冲池,将会造成其他线程必须等待的瓶颈。

4,innodb_concurrency_tickets全局动态变量。5.6.6之后默认5000,之前是500。

该参数意义是同一时刻,能访问InnoDB引擎数据的线程数,当访问InnoDB引擎数据的线程数达到设置的上线,线程将会被放到队列中,等待其他线程释放ticket。

5,innodb_old_blocks_time:全局动态变量。5.6.6之后默认是1000,之前是0。单位是毫秒。

该参数表示等到该时间后,再读取该页则会进入到new端,有效的避免了对于上述SQL对BP的污染。默认是0,单位是毫秒。如设置为1000则表示:读到该页到midpoint的位置,要再等1秒之后读取该页才能进入new列表。而0则表示读取到该页则会直接被放入到new列表。具体的可以看这里。和innodb_old_blocks_pct配合使用,该参数默认是37(3/8),即BP的3/8处。

6,innodb_stats_on_metadata:全局动态变量。5.6.6之后默认是OFF,之前是ON。

该参数的作用是查询 information_schema 元数据库里的表时,Innodb 还会随机提取其他数据库每个表索引页的部分数据。当你的表很大,并且数量很多时,耗费的时间就会很长,很多不访问的数据也会进入到Innodb_Buffer_Pool 缓冲池里,那么就会把缓冲池所污染。并且 ANALYZE TABLE和 SHOW TABLE STATUS 语句也会造成 Innodb 随机提取数据。可以动态关闭 innodb_stats_on_metadata,默认是开启的,建议关闭

7,innodb_adaptive_flushing_lwm:全局动态变量。5.6.6支持,默认值得10。

该参数表示redo log(ib_logfile)的一个最低容量限制百分比,默认为10,范围是[0,70]。当没有达到这个值时,page cleaner线程不会根据redo来判断是否刷脏页,超过则通过参数innodb_adaptive_flushing来刷写。

8,innodb_buffer_pool_dump_at_shutdown全局动态变量,默认关闭。

该参数表示当数据库关闭时,是否把BP里的数据导出到文件里,建议开启。如果一台高负荷的机器重启后,buffer pool中的热数据被丢失,此时就会重新从磁盘加载到Buffer_Pool缓冲池里,这样当高峰期间,性能就会变得很差,连接数就会很高,应用的性能也受到影响

9,innodb_buffer_pool_dump_now:全局动态变量,默认关闭。

该参数表示采用手工方式把热数据dump到本地磁盘文件。可以在数据库运行时执行。

10,innodb_buffer_pool_filename:全局变量,默认:ib_buffer_pool

该参数控制BP导出的文件名。

11,innodb_buffer_pool_load_abort全局动态变量,默认OFF。

该参数表示中止缓冲池加载操作。

12,innodb_buffer_pool_load_at_startup:全局变量,默认OFF。

该参数表示在数据库启动时,把dump出来的数据加载到内存,建议开启。

13,innodb_buffer_pool_load_now:全局变量,默认OFF。

该参数表示在数据库运行时,把dump出来的数据加载到内存。

14,innodb_change_buffer_max_size:全局动态变量,默认是25,单位百分比。

该参数表示InnoDB为了避免更新数据时更新索引损失太多性能,使用了这种称为Insert Buffer的方法来缓冲索引更新。关于插入缓冲的概念可以查找资料,也可以看这里。原先插入缓冲最大使用空间为1/2的缓冲池大小,5.6之后可以控制插入缓冲的大小了,默认是BP的1/4。

15,innodb_disable_sort_file_cache:全局动态变量,默认OFF。

该参数开启表示操作系统不对merge-sort的临时文件cache,使用O_DIRECT。

16,innodb_flush_log_at_timeout:全局动态变量,默认1,范围是1~2700。

该参数表示自定义刷新日志时间,每隔这么多秒刷一次日志,只有在innodb_flush_log_at_trx_commit=2时才生效。大致的原因是:

MySQL 5.6比较重要的参数,以及5.5到5.6默认值有过变化的参数
1.INNODB REDO日志:InnoDB为了保证日志的刷写的高效,使用了内存的log buffer。
由于InnoDB大部分情况下使用的是文件系统,(linux文件系统本身也是有buffer的)而不是直接使用物理块设备,这样的话就有两种丢失日志的可能性:日志保存在log_buffer中,机器挂了,对应的事务数据就丢失了;日志从log buffer刷到了linux文件系统的buffer,机器挂掉了,对应的事务数据就丢失了。
2.InnoDB有一个参数用于设置这两个缓存的刷新: innodb_flush_log_at_trx_commit。而 innodb_flush_log_at_trx_commit  有三个值:0/1/2,默认是1。而innodb_flush_log_at_timeout 定义了每次日志刷新的时间,与  innodb_flush_log_at_trx_commit 配合使用:
innodb_flush_log_at_trx_commit=1,表示在每次事务提交的时候,都把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。
innodb_flush_log_at_trx_commit=0,表示每隔一秒把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。
innodb_flush_log_at_trx_commit=2,表示在每次事务提交的时候会把log buffer刷到文件系统中(os buffer)去,但是每隔一秒调用文件系统(os buffer)的“flush”操作将缓存刷新到磁盘上去。如果只是MySQL数据库挂掉了,由于文件系统没有问题,那么对应的事务数据并没有丢失。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据。这样的好处,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存中,对底层IO没有压力)。MySQL 5.6.6以后,这个“1秒”的刷新还可以用innodb_flush_log_at_timeout来控制刷新间隔。
MySQL 5.6比较重要的参数,以及5.5到5.6默认值有过变化的参数

具体的原因可以看这里这里

17,innodb_flush_log_at_trx_commit:动态变量,默认是1。

该参数表示的是日志刷写机制,可选值有0,1,2。具体意思见16。

18,innodb_flush_method全局变量。默认为NULL。

该参数表示刷写的模式,在5.6.7之后多了一个值:O_DIRECT_NO_FSYNC,具体说明见这里

19,innodb_flush_neighbors:全局动态变量,默认是1。

该参数表示刷新邻接页,当刷写一个脏页时,会检测该页在BP里所在的区(extent:64页,1M)的其他页是否也有脏页,有则一起刷写。5.6通过参数:innodb_flush_neighbors 参数控制。机械磁盘建议开启,固态硬盘建议设置为0,即关闭。要不是随机IO多则建议开启,充分利用顺序IO去写数据。

20,innodb_flushing_avg_loops:全局动态变量,默认是30,范围是1-1000。

该参数表示控制adaptive flush对工作负载变化的响应速度。在这么多次loop内,innodb会保持上次的刷新状态快照不变,增加这个值有助于刷新操作更加平稳,而减小这个值有助于对工作负载的变化更快的调整adaptive flush,不过,如果设置的过小的话,在突然增大/减小的工作的负载中,容易引起性能尖峰。

21,innodb_force_load_corrupted:全局变量。默认关闭

该参数表示当innodb表损坏时开启数据库导入表,排查故障,修复数据时不可能访问, 当故障排除后,关闭此设置回关闭并重新启动服务器。可以和innodb_force_recovery关联。

22,Innodb FullText关于InnoDB的全文索引的说明见官方文档,使用方法见:之前介绍的文章

23,innodb_large_prefix:全局动态变量,默认关闭。

该参数表示当innodb为字段创建索引时,限制的字节长度。关闭时,字节长度大于767则会报warnings。开启时,则会报错,创建不成功。

zjy@192.168.200.59 : test 11:39:29>create table ttt(id int,name varchar(1024)) default charset utf8;
Query OK, 0 rows affected (0.00 sec)

zjy@192.168.200.59 : test 11:39:46>alter table ttt add index idx_name(name);
Query OK, 0 rows affected, 1 warning (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 1

zjy@192.168.200.59 : test 11:39:58>show warnings;                                                                                                                                    +---------+------+---------------------------------------------------------+
| Level   | Code | Message                                                 |
+---------+------+---------------------------------------------------------+
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
+---------+------+---------------------------------------------------------+
1 row in set (0.01 sec)

zjy@192.168.200.59 : test 11:40:00>show create table ttt\G;
*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(1024) DEFAULT NULL,
  KEY `idx_name` (`name`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

zjy@192.168.200.59 : test 11:40:26>alter table ttt add address varchar(1024);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

dba@192.168.200.59 : test 11:39:03>set global innodb_large_prefix = 1;
Query OK, 0 rows affected (0.00 sec)

zjy@192.168.200.59 : test 11:40:33>alter table ttt add index idx_address(address);
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

dba@192.168.200.59 : test 11:41:10>set global innodb_large_prefix = 0;
Query OK, 0 rows affected (0.01 sec)

zjy@192.168.200.59 : test 11:40:57>alter table ttt add index idx_address(address);
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 1
View Code 

相关文章: