#[mysqld_multi]
#mysqld=/usr/local/mysql/bin/mysqld_safe
#mysqladmin=/usr/local/mysql/bin/mysqladmin
#user=root
#log=/data/mysqllog/multi.log
[mysqld]
explicit_defaults_for_timestamp=true  #意思是为timestamp类型的列明确的注明default值。
# tmp for mysql load data infile,load finish ,need to set to 1
#innodb_doublewrite=0
innodb_doublewrite  #提高innodb的可靠性,用来解决部分写失败

#**********************Server**************************
#******server start related
optimizer_switch='index_condition_pushdown=on' #控制mysql优化器行为,MySQL 5.6 开始支持index_condition_pushdown特性,即server层把可以在index进行filter的谓词传递给引擎层完成过滤,然后结果返回到server。使用index_condition_pushdown=on优点有:1. 数据copy,减少了InnoDB层返回给server层的数据量,减少了数据copy。2. 随机读取,对于二级索引的扫描和过滤,减少了回primary key上进行随机读取的次数。3. 记录锁,记录锁是在InnoDB层完成的,比如如果是select for update语句,就会发现index_condition_pushdown会大大减少记录锁的个数。缺点:1. 索引类型,如果索引类型是primary key,就不会采用,因为index_condition_pushdown最大的好处是减少回表的随机IO,所以如果使用的index是PK,那么收益就大大减少,2. 性能衰减,如果在primary key上面使用, 或者index filter谓词并不能有效过滤记录的时候,会发现sysbench的测试性能相比较关闭ICP的方式略低。3. SQL类型1.不支持多表update和delete语句,因为select和update会共用handler,而一个是一致性读,一个是当前读,同样的filter都apply的话,update会找不到记录。2. 如果JOIN是CONST 或者 SYSTEM,不能使用。 因为CONST和SYSTEM做了特别优化,只执行一次,做了缓存,而应用filter的话,会产生数据一致性问题。
optimizer_switch='mrr=on' #MRR 的全称是 Multi-Range Read Optimization,是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段MRR 的全称是 Multi-Range Read Optimization,是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段。除了MRR还有一个Bak
#optimizer_switch='mrr_sort_keys=on'
optimizer_switch='mrr_cost_based=off' #建议关闭基于成本的算法来确定是否需要开启MRR特性,以保证有效开启MRR;ICP+MRR的性能最好,其次是ICP;ICP的性能比传统技术提高了47%,再开启MRR后,性能比传统技术提高了98%。
#optimizer_switch='join_cache_incremental=on'
#optimizer_switch='join_cache_hashed=on'
#optimizer_switch='join_cache_bka=on'
#join_cache_level=2  #4 for hash join
join_buffer_size=256K #如果应用中,很少出现join语句,则可以不用太在乎join_buffer_size参数的设置大小。如果join语句不是很少的话,个人建议可以适当增大join_buffer_size到1MB左右,如果内存充足可以设置为2MB
#join_buffer_space_limit=64M
#userstat=1

user=mysql   #MySQL默认用户
bind-address=0.0.0.0 #监听所有IP
port=3306   # 设置mysql客户端连接服务端时默认使用的端口
#port-open-timeout= 
server-id=1  MySQL的serverID
#chroot 
#init-file=file_name 
#core-file=OFF 
#skip-grant-tables 
#******location
basedir=/usr/local/mysql  #MySQL的安装路径 
pid-file=/data/mysqldata/mysql.pid #MySQL实例启动时,会将自己的进程ID写入一个文件中——该文件即为pid文件。该    文件可由参数pid_file控制,默认位于数据库目录下,文件名为主机名.pid
socket=/data/mysqldata/mysql.sock   #作用是程序与mysqlserver处于同一台机器,发起本地连接时可用,这是他的路径
datadir=/data/mysqldata   #mysql数据的存放目录
tmpdir=/data/tmp   #mysql数据库临时存放目录 
plugin-dir=/usr/local/mysql/lib/plugin  #MySQL共享库目录

#******security
#secure-auth 
safe-user-create  #如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。
#skip-show-database 
max_user_connections=2980  #用户最大连接数
max_connect_errors=100000  #max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors的值与性能并无太大关系。
secure-file-priv=/tmp #当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下,ure_file_priv的值为null ,表示限制mysqld 不允许导入|导出,当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
#max_prepared_stmt_count= 
#skip-ssl 
#ssl-ca=file_name 
#ssl-capath=directory_name 
#ssl-cert=file_name 
#ssl-cipher=cipher_list 
#ssl-key=file_name 
#******features
default-storage-engine=InnoDB  #mysql的默认引擎是InnoDB
#ansi 
#sql-mode= 
#auto_increment_increment=1 
#auto_increment_offset=1 
#div_precision_increment=4 
event-scheduler=on #MySQL事件 off 没有开启  on开启
#skip-event-scheduler 
#flush 
#flush_time= 
#old 
#old-alter-table 
#old-style-user-limits 
partition
#skip-partition 
#plugin_dir= 
#plugin-load=plugin_list 
#symbolic-links 
#skip-symbolic-links 
lock_wait_timeout=600  #使用 lock_wait_timeout 来防止 DDL 导致 Waiting metadata lock
#sync_frm 
#temp-pool 
#updatable_views_with_limit 
#******function
#allow-suspicious-udfs 
#des-key-file=file_name 
group_concat_max_len=10240 #group_concat数据量小的时候没什么问题,但是数据量大的时候就有问题了,group_concat:默认可连接的长度是1024;如果已经设置了最大长度,超过这个长度就会被截取至这个长度;
#max_long_data_size= 
sysdate-is-now
#default_week_format= 

#******character set&time zone etc..
character-set-server=utf8  #默认字符集是UTF8
collation-server=utf8_general_ci  #用于指定数据集如何排序,以及字符串的比对规则。
#character-set-client-handshake 
#skip-character-set-client-handshake 
character-set-filesystem=utf8  #把os上文件名转化成此字符集,即把 character_set_client转换        character_set_filesystem, 默认binary是不做任何转换的
#character-sets-dir=
#lower_case_file_system 
lower_case_table_names=0  #为1时:表名存储在磁盘是小写的,但是比较的时候是不区分大小写;为2时:表名存储为给定的大小写但是比较的时候是小写的;为0时:表名存储为给定的大小和比较是区分大小写的 
#lc-messages= 
#lc-messages-dir= 
#default-time-zone= 
#******buffer&cache
#memlock 
#large-pages 
#join_buffer_size=128K  #first lines set 
sort_buffer_size=8m  #是一个connection级参数,在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存.并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。
table_open_cache=1024   # default value is 400  #指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。
table_definition_cache=1024 # default value is 400 #表定义信息缓存是从MySQL5.1.3 版本才开始引入的一个新的缓存区,用来存放表定义信息。当我们的MySQL 中使用了较多的表的时候,此缓存无疑会提高对表定义信息的访问效率。MySQL 提供了table_definition_cache 参数给我们设置可以缓存的表的数量。在MySQL5.1.25 之前的版本中,默认值为128,从MySQL5.1.25 版本开始,则将默认值调整为256 了,最大设置值为524288。注意,这里设置的是可以缓存的表定义信息的数目,而不是内存空间的大小。表定义信息缓存是从MySQL5.1.3 版本才开始引入的一个新的缓存区,用来存放表定义信息。当我们的MySQL 中使用了较多的表的时候,此缓存无疑会提高对表定义信息的访问效率。MySQL 提供了table_definition_cache 参数给我们设置可以缓存的表的数量。在MySQL5.1.25 之前的版本中,默认值为128,从MySQL5.1.25 版本开始,则将默认值调整为256 了,最大设置值为524288。注意,这里设置的是可以缓存的表定义信息的数目,而不是内存空间的大小。
#range_alloc_block_size= 
#query_prealloc_size= 
#query_alloc_block_size= 
#stored_program_cache= 
#*****query cache
query_cache_type=0 #这个变量控制着查询缓存工能的开启的关闭 0时表示关闭,1时表示打开,2表示只要select 中明确指    定SQL_CACHE才缓存
query_cache_size=0 # 查询缓存的大小
#query_cache_min_res_unit= 
query_cache_limit=0  #表示单个结果集所被允许缓存的最大值
#query_cache_wlock_invalidate 
#******thread&connection
thread_handling=one-thread-per-connection #MySQL处理连接的方式是One-Connection-Per-Thread,即对于每一个数据库连接,MySQL-Server都会创建一个独立的线程服务,请求结束后,销毁线程。再来一个连接请求,则再创建一个连接,结束后再进行销毁。
#slow_launch_time= 
#init_connect= 
back_log=300 # default value is 150 #back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源
thread_cache_size=512 # default value is 0 #Thread_Cache 中存放的最大连接线程数.在短连接的应用中Thread_Cache的功效非常明显,因为在应用中数据库的连接和创建是非常频繁的,如果不使用 Thread_Cache那么消耗的资源是非常可观的!在长连接中虽然带来的改善没有短连接的那么明显,但是好处是显而易见的.但并不是越大越好大了反而 浪费资源这个的确定一般认为和物理内存有一定关系 
max_connections=2000 #最大连接数
#******temptable
#big-tables 
#tmp_table_size=64m 
tmp_table_size=128m  #for mairadb #临时表的大小
#max_heap_table_size=64m
max_heap_table_size=128m #for mairadb #这个变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值,这个变量和tmp_table_size一起限制了内部内存表的大小。
#******network
#skip-networking 
skip-name-resolve  #这个参数是禁止域名解析的,包括主机名
#skip-host-cache 
net_buffer_length=16k  #from 8k change to default value 16k 20150210  通信时缓存数据的大小.最小4k,最大16M,默认是1M.
max_allowed_packet=128m  #server接受的数据包大小
connect_timeout=10  #连接超时
wait_timeout=3600 #服务器关闭非交互连接之前等待活动的秒数。单位是s
interactive_timeout=120  #服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
net_read_timeout=3 #set to 10 if across IDC     default vale 30  #数据读取超时时间。在终止读之前,从一个连接获得数据而等待的时间秒数;当服务正在从客户端读取数据时,net_read_timeout控制何时超时。即客户端执行数据读取,等待多少秒仍未执行成功时自动断开连接。
net_write_timeout=6 #set to 10 if across IDC    default vale 60 #数据库写超时时间。和net_read_timeout意义类似,在终止写之前,等待多少秒把block写到连接;当服务正在写数据到客户端时,net_write_timeout控制何时超时。
net_retry_count=2 #set to 5 if across IDC       default vale 10 #如果某个通信端口的读操作中断了,在放弃前重试多次
#*****profile&optimizer
#profiling 
profiling_history_size=5    # default value is 15 保留最近执行的记录数量。默认15,最大100,0相当于禁用。
#optimizer_prune_level= 
#optimizer_search_depth= 
#optimizer_switch= 
#max_seeks_for_key=1000 
max_length_for_sort_data=4096   # default value is 1024 可以通过改变 max_length_for_sort_data变量的值来影响mysql选择的算法。#如果增大了max_length_for_sort_data的值,并且磁盘使用率上升,cpu使用率下降,        sort_merge_passes的值比以前增加的更快,也许该强制排序使用单路排序算法。
#******limitation
#max_error_count= 
#max_join_size= 
#max_sort_length= 
max_sp_recursion_depth=255 #这个修改课涉及到全局和session级修改, 全局修改的话 需要 有super权限: set global max_sp_recursion_depth=2, session级修改的话只对当前连接有效。不需要加global,你可以执行 show privileges 查看权限列表,找到super,看看描述是什么就知道了
open-files-limit=8192  #用于指定操作系统允许mysqld打开的最大文件数。只读变量,修改需要重启mysql服务。
#thread_stack=512k 
#**********************Logs****************************
log-output=FILE #表示将日志存入文件,默认值是‘FILE‘ log_output=‘TABLE‘表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中.
#*****error log
log-error=/data/mysqllog/error.log  #错误日志的存放路径
#log-warnings       default value 1
#skip-log-warnings  no this variable,cancel 
#*****slow log
slow-query-log  #开始慢查询日志
slow_query_log_file=/data/mysqllog/slow.log  #慢查询日志存放位置
long_query_time=1  #大于1s的慢查询记录都记录下来,给开发优化
#log-queries-not-using-indexes 
log-slow-admin-statements #管理语句和没有使用index的查询将不记录,可以通过  --log-slow-admin-statements 和             log_queries_not_using_indexes来设定是否记录。
log-slow-slave-statements #一个复制从库不会记录复制查询的日志。为了改变这个,可以使用参数--log-slow-slave-statements直接查看慢查询日志文件是一项艰巨的任务,我们可以使用mysqldumpslow工具来辅助。
#min-examined-row-limit=10 

#log_slow_verbosity='Query_plan,Innodb'  #for mariadb, for future can add 'explain' 
#*****general log
#general-log 
#general_log_file=/data/mysqllog/query.log 
#**********************Replication*********************
skip-slave-start  #启动mysql,不启动复制
read_only=0 #从库的只读,0是关闭只读,1是开启只读
#init_slave= 
master-info-file=master.info  #这个文件时在建立主从复制时产生的
#sync_master_info=1000 
#slave_type_conversions= 
#slave_transaction_retries= 
#slave_exec_mode= 
#slave-skip-errors=1062 1064 1146 #only for 216
slave-load-tmpdir=/data/tmp     #当备份从服务器的数据时,你还应备份这两个小文件以及中继日志文件。它们用来在恢复从服务器的数据后继续进行复制。如果丢失了中继日志但仍然有 relay-log.info文件,你可以通过检查该文件来确定SQL线程已经执行的主服务器中二进制日志的程度。然后可以用 Master_Log_File和Master_LOG_POS选项执行CHANGE MASTER TO来告诉从服务器重新从该点读取二进制日志。当然,要求二进制日志仍然在主服务器上。 如果从服务器正复制LOAD DATA INFILE语句,你应也备份该目录内从服务器用于该目的的任何SQL_LOAD-*文件。从服务器需要这些文件继续复制任何中断的LOAD DATA INFILE操作。用--slave-load-tmpdir选项来指定目录的位置。如果未指定, 默认值为tmpdir变量的值 
#slave_parallel_threads=0 # for mariadb10 

#******network
slave_compressed_protocol=0 #for RBR  #如果该选项设置为 1,如果从服务器和主服务器均支持,使用压缩从服务器/主服务器协议。0则关闭
#slave-max-allowed-packet= 
slave-net-timeout=30  #MySQL主从复制的时候, 当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据
#master-retry-count= 
#******report
#show-slave-auth-info 
#report-host= 
#report-password= 
#report-port= 
#report-user= 
#*****binlog
log-bin=/data/mysqlbinlog/mysql-bin   #MySQLbinlog的存放目录
log-bin-index=/data/mysqlbinlog/mysql-bin.index #MySQLbinlog目录会生成一个mysql-bin.index的索引
#sync_binlog=100         #close for sas
#binlog-format=MIXED
binlog-format=row #binlog日志的储存方式  mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。使用ROW来存储的话,需要转二进制才能看到里面语句,否则都是乱码
max_binlog_size=1024m   #default value 1G  #binlog日志的最大大小
expire_logs_days=3   #保留多少天的binlog日志
binlog_cache_size=256K # default value 32K  #初始值,为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
#max_binlog_cache_size=256m #increase this for RBR
max_binlog_cache_size=1024m    # change from 1024 to default value 4096 on 20150210  #最大值,为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_stmt_cache_size=32k  #初始值,这是在事务执行时专门为非事务sql语句分配的一个二进制日志缓存。
max_binlog_stmt_cache_size=256m  # change from 256 to default value 4096 on 20150210  #最大值,这是在事务执行时专门为非事务sql语句分配的一个二进制日志缓存。
binlog-row-event-max-size=256m  #基于行的二进制日志事件的最大字节数。 应该是256的倍数。最小值为256,最大值为18446744073709547520。
#log-short-format 
log_slave_updates #参数用来控制M01是否把所有的操作写入到binary log,默认的情况下mysql是关闭的;为1是开启,为0时是关闭
log-bin-trust-function-creators #当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。
#binlog_direct_non_transactional_updates 

#*****relaylog
#relay-log=relay-bin 
#relay-log-index=relay-bin.index 
#relay-log-info-file=relay-log.info 
#sync_relay_log=1000 
#sync_relay_log_info=1000 
#max_relay_log_size= 
#relay_log_space_limit=100G 
#relay_log_purge=1 
#relay_log_recovery 
#******filter
#binlog-do-db= 
#binlog-ignore-db= 
#replicate-do-db= 
#replicate-ignore-db= 
#replicate-do-table= 
replicate-ignore-table=mysql.%          #这里代表忽略mysql这个数据库,其他库都正常主从复制
#replicate-wild-do-table= 
#replicate-wild-ignore-table= 
#replicate-same-server-id 
#replicate-rewrite-db= 
#**********************InnoDB**************************
innodb_data_home_dir=/data/mysqldata  #这是InnoDB表的目录共用设置。如果没有在 my.cnf 进行设置,InnoDB 将使用MySQL的 datadir 目录为缺省目录。如果设定一个空字串,可以在 innodb_data_file_path 中设定绝对路径
innodb_data_file_path=ibdata1:128M:autoextend  #单独指定数据文件的路径与大小。数据文件的完整路径由     innodb_data_home_dir 与这里所设定值的组合。 文件大小以 MB 单位指定。因此在文件大小指定后必有“M”。 InnoDB 也支持缩写“G”, 1G = 1024M。从 3.23.44 开始,在那些支持大文件的操作系统上可以设置数据文件大小大于 4 GB。而在另一些操作系统上数据文件必须小于 2 GB。数据文件大小总和至少要达到 10 MB。在 MySQL-3.23 中这个参数必须在 my.cnf 中明确指定。在 MySQL-4.0.2 以及更新版本中则不需如此,系统会默认在 MySQL 的 datadir 目录下创建一个 16 MB 自扩充(auto-extending)的数据文件 ibdata1。
innodb_log_group_home_dir=/data/mysqldata    #InnoDB 日志文件的路径。必须与 innodb_log_arch_dir 设置相同值。 如果没有明确指定将默认在 MySQL 的 datadir 目录下建立两个 5 MB 大小的 ib_logfile... 文件。
innodb_log_files_in_group=4 #日志组中的日志文件数目。InnoDB 以环型方式(circular fashion)写入文件。数值 3 被推荐使用。在 my.cnf 中以数字格式设置。
innodb_log_file_size=128M  #日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组中日志文件的数目,那么理想的数值为 1M 至下面设置的缓冲池(buffer pool)大小的 1/n。较大的值,可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。 日志文件总和必须小于 2 GB,3.23.55 和 4.0.9 以上为小于 4 GB。在 my.cnf 中以数字格式设置。
#*****feature
innodb_open_files=4096   #from 10.0   autosized   #限制Innodb能打开的表的数据,默认为300,数据库里的表特别多的情况,可以适当增大为1000。innodb_open_files的大小对InnoDB效率的影响比较小。但是在InnoDBcrash的情况下,innodb_open_files设置过小会影响recovery的效率。所以用InnoDB的时候还是把innodb_open_files放大一些比较合适。
#innodb_change_buffering=inserts 
innodb_change_buffering=all #change by alading 20141119,all is default value #当更新/插入的非聚集索引的数据所对应的页不在内存中时(对非聚集索引的更新操作通常会带来随机IO),会将其放到一个insert buffer中,当随后页面被读到内存中时,会将这些变化的记录merge到页中。当服务器比较空闲时,后台线程也会做merge操作,但insert buffer会占用buffer pool,并且在非聚集索引很少时,并不总是必要的,反而会降低buffer pool做data cache的能力,5.5提供了参数innodb_change_buffering来对其进行控制
innodb_adaptive_hash_index=ON  #哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为O(1)。常用于连接(join)操作,如SQL Server和Oracle中的哈希连接(hash join)。但是SQL Server和Oracle等常见的数据库并不支持哈希索引(hash index)。MySQL的Heap存储引擎默认的索引类型为哈希,而InnoDB存储引擎提出了另一种实现方法,自适应哈希索引(adaptive hash index)。InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive)的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。根据InnoDB的官方文档显示,启用自适应哈希索引后,读取和写入速度可以提高2倍;对于辅助索引的连接操作,性能可以提高5倍。在我看来,自适应哈希索引是非常好的优化模式,其计思想是数据库自优化(self-tuning),即无需DBA对数据库进行调整
innodb_autoinc_lock_mode=2   # rbr and read commited ,can set to 2,changed from 1 to 2 by alading on 20150805  #这个参数控制着在向有auto_increment 列的表插入数据时,相关锁的行为
#innodb_large_prefix 
#innodb_strict_mode 
#innodb_use_sys_malloc= 
#******buffer&cache
innodb_buffer_pool_size=256M     #for mariadb 60%mem  InnoDB 用来高速缓冲数据和索引内存缓冲大小。 更大的设置可以使访问数据时减少磁盘 I/O。在一个专用的数据库服务器上可以将它设置为物理内存的 80 %。 不要将它设置太大,因为物理内存的使用竞争可能会影响操作系统的页面调用。在 my.cnf 中以数字格式设置。
innodb_buffer_pool_instances=8   # change from 4 to default value 8 on 20150210  innodb_buffer instance 个数
innodb_max_dirty_pages_pct=50    # default  value =75   脏页占buffer最大比例
innodb_old_blocks_pct=25  #  参数是控制进入到sublist of old blocks区域的数量,初始化默认是37.1、如果在业务中做了大量的全表扫描,那么你就可以将innodb_old_blocks_pct设置减小,增到innodb_old_blocks_time的时间,不让这些无用的查询数据进入old区域,尽量不让缓存再new区域的有用的数据被立即刷掉。(这也是治标的方法,大量全表扫描就要优化sql和表索引结构了)2、如果在业务中没有做大量的全表扫描,那么你就可以将innodb_old_blocks_pct增大,减小    innodb_old_blocks_time的时间,让有用的查询缓存数据尽量缓存在innodb_buffer_pool_size中,减小磁盘io,提高性能。
innodb_old_blocks_time=3000  #参数是在访问到sublist of old blocks里面数据的时候控制数据不立即转移到sublist of new blocks区域,而是在多少微秒之后才会真正进入到new区域,这也是防止new区域里面的数据不会立即被踢出。
#innodb_additional_mem_pool_size=32m 
innodb_log_buffer_size=32m # changed from 8m to 32m by alading on 20150805   InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。 因此,如果有大的事务处理,设置大的日志缓冲可以减少磁盘I/O。 在 my.cnf 中以数字格式设置。

#******IO
innodb_flush_method=O_DIRECT  #这个参数仅仅与 Unix 相关。这个参数默认值为 fdatasync。 另一个设置项为 O_DSYNC。这仅仅影响日志文件的转储,在 Unix 下以 fsync 转储数据。InnoDB 版本从 3.23.40b 开始,在 Unix 下指定 fdatasync 为使用 fsync 方式、指定 O_DSYNC 为使用 O_SYNC 方式。由于这在某些 Unix 环境下还有些问题所以在 'data' versions 并没有被使用。
innodb_use_native_aio  #用来控制是否启用Native AIO,在Linux操作系统下,默认值为ON,用户可以通过开启和关闭Native AIO功能来比较InnoDB性能的提升。官方的测试显示,启用Native AIO,恢复速度可以提高75%。在InnoDB存储引擎中,read ahead方式的读取都是通过AIO完成,脏页的刷新,即磁盘的写入操作则全部由AIO完成。
innodb_adaptive_flushing  # 该值影响每秒刷新脏页的操作,开启此配置后,刷新脏页会通过判断产生重做日志的速度来判断最合适的刷新脏页的数量;
innodb_flush_log_at_trx_commit=2  #innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数,当两个参数都设置为1的时候写入性能最差,推荐做法是innodb_flush_log_at_trx_commit=2,sync_binlog=500 或1000
innodb_io_capacity=1200  # 在5.1.X版本中,最多只会刷新100个脏页到磁盘、合并20个插入缓冲,即使磁盘有能力处理更多的请求,只能会处理这么多,这样在更新量较大的时候,脏页刷新就可能跟不上,导致性能下降。但在5.5.X版本里,innodb_io_capacity参数可以动态调整刷新脏页的数量,这在一定程度上解决了这一问题。innodb_io_capacity默认是200,单位是页,该参数的设置大小取决于硬的IOPS,即每秒每秒的输入输出量(或读写次数)。
innodb_io_capacity_max=2400 #刷新脏页的数量最大值
innodb_read_io_threads=8   # changed from 4 to 8 by alading on 20150805 设置read thread(读线程个数,默认是4个)
innodb_write_io_threads=8  # changed from 4 to 8 by alading on 20150805 设置write thread(写线程个数,默认是4个)
innodb_read_ahead_threshold=56 #它可以根据顺序访问缓冲池中的页面,预测哪些页面可能需要很快。通过使用配置参数    innodb_read_ahead_threshold,通过调整触发异步读取请求所需的顺序页访问数,可以控制Innodb执行提前读操作的时间。在添加此参数之前,InnoDB只会计算当在当前范围的最后一页中读取整个下一个区段时是否发出异步预取请求。
#innodb_doublewrite 
innodb_purge_threads=1  #控制是否使用独立purge线程,1是启用,0是关闭
innodb_purge_batch_size=300  #表示一次完成多少个undolog page;但这个值有一个有趣的副作用是会影响到undolog的释放,因为总是在128轮purge后释放undolog page,在5.5及之后版本,开始支持128个回滚段。
innodb_lru_scan_depth=1024  #是5.6新增加的参数,根据 官方文档 描述,它会影响page cleaner线程每次刷脏页的数量,这是一个每1秒  loop一次的线程。在Innodb内部,这个参数对应变量为srv_LRU_scan_depth,grep了一把,有几个地方会涉及到这个参数
#innodb_max_purge_lag= 
#*****fileformat
innodb_file_per_table  #使每个Innodb的表,有自已独立的表空间。如删除表后可以回收那部分空间。默认是关闭的,建议打开(innodb_file_per_table=1)
innodb_autoextend_increment=64 # change from 32 to default value 64 on 20150212 这个参数的作用是控制innodb 共享表空间文件自动扩展的大小,在mysql 5.6.5版本之前默认值是8Mb,从5.6.6版本之后默认为64Mb,最小值为1Mb最大值为1000Mb。当然了,这个参数受到innodb_file_per_table参数的影响,需要注意!
#innodb_file_format=Barracuda 
#innodb_file_format_check= 
#innodb_file_format_max= 
#******static&status
#innodb_stats_on_metadata
innodb_stats_on_metadata=0  #for mariadb   索引统计 0为关闭,1为开启
innodb_stats_sample_pages=32  #default value is 8   每次收集统计信息时采样的页数,默认为8
innodb_stats_persistent_sample_pages=32 #for mariadb10 这个参数控制着采样的数量,跟oracle动态采样参数含义相同
innodb_stats_method=nulls_unequal  #用来判断如何对待索引中出现NULL值记录。该参数默认值为nulls_equal,表示将NULL值记录为相等的记录。其有效值还nulls_unequal,nulls_ignored,分别表示将NULL值记录视为不同的记录和忽略NULL值记录
#timed_mutexes 
#innodb-status-file 

metadata_locks_hash_instances=256 # add by alading on 20150805  通过分片来提高并发度,与InnoDB AHI类似

#******recovery&related
innodb_fast_shutdown=1 #告诉innodb在它关闭的时候该做什么工作,1.  0表示在innodb关闭的时候,需要purge all, merge insert buffer,flush dirty pages。这是最慢的一种关闭方式,但是restart的时候也是最快的。后面将介绍purge all,merge insert buffer,flush dirty pages这三者的含义。2.  1表示在innodb关闭的时候,它不需要purge all,merge insert buffer,只需要flush dirty page。3.  2表示在innodb关闭的时候,它不需要purge all,merge insert buffer,也不进行flush dirty page,只将log buffer里面的日志flush到log files。因此等下进行恢复的时候它是最耗时的。 参考文章:http://blog.csdn.net/zbszhangbosen/article/details/7434093
#innodb_force_load_corrupted 
#innodb_force_recovery= 
innodb_checksums # for maria10 new variable: innodb_checksum_algorithm  在页中的数据校验码,帮助发现文 件系统错误,内存损坏和其它问题
#******transaction,lock,concurrency,rollback
autocommit=1  #InnoDB默认就是使用事务,甚至你不知道如何使用。 每句语句都将在自己的事务内(假设你运行“autocommit”模式 set autocommit=1),在每句语句后面 都会自动增加commit语句。
#transaction-isolation=REPEATABLE-READ 
transaction-isolation=READ-UNCOMMITTED #for mariadb #修改事务隔离级别,可选参数有:READ-UNCOMMITTED(读取未提交内容), READ-COMMITTED(读取提交内容), REPEATABLE-READ(可重读), SERIALIZABLE(可串行化)具体见帖子http://blog.csdn.net/white_ice/article/details/61914304.
#transaction_prealloc_size=64k 
#transaction_alloc_block_size=64k 
completion_type=NO_CHAIN # default value 为0 时COMMIT和COMMIT WORK功能完全相同。为1 时COMMIT WORK等于COMMIT AND CHAIN,表示提交后马上开启一个相同隔离级别的事务。为2 时COMMIT WORK等于COMMIT AND RELEASE,当事务提交后会自动断开与服务器的链接。
innodb_support_xa  #innodb_support_xa的作用是分两类:第一,支持多实例分布式事务(外部xa事务),这个一般在分布式数据库环境中用得较多。第二,支持内部xa事务,说白了也就是说支持binlog与innodb redo log之间数据一致性
innodb_table_locks #当系统变量innodb_table_locks=1时,LOCK TABLES会在表上持有两个锁,一个是MySQL层持有的锁,另外InnoDB层也需要持有一个锁,InnoDB引擎在事务中持有的锁会在事务提交或回滚时释放,因此当autocommit=1时执行LOCK TABLE没有意义,因为持有的锁会马上释放
#innodb_lock_wait_timeout=30 
innodb_lock_wait_timeout=45 # for mariadb setup 指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败
#innodb_locks_unsafe_for_binlog 
innodb_spin_wait_delay=12   # default value 6 控制轮训间 隔,也就是说在每次轮训的过程中,会休息一会儿然后再轮训
innodb_sync_spin_loops=90   # default value 30 innodb_sync_spin_loops参数是自旋锁的轮转数,可以通过show     engine innodb status来查看。相较于系统等待,自旋锁是低成本的等待;不过它是一个活跃的等待,会浪费一些cpu资源。因此如果看到大量的自旋等待和自旋轮转,则很显然它浪费了很多cpu资源。浪费cpu时间和无谓的上下文切换之间可以通过该值来平衡。
innodb_commit_concurrency=0   # default value, the number of transaction threads that can can commit simultaneously,no limit该值只能为默认值0,mysql不限制并发提交。大于0表示允许N个事务在同一时间点提交,N的范围是0-1000。 
innodb_thread_concurrency=32       #at least equal cpu nums  认是0,则表示没有并发线程数限制,所有请求都会直接请求线程执行。注意:当 innodb_thread_concurrency 设置为0时,则innodb_thread_sleep_delay的设置将会被忽略,不起作用。如果数据库没出现性能问题时,使用默认值即可。
#innodb_concurrency_tickets=5000  #default value 
#innodb_replication_delay=0 
#innodb_thread_sleep_delay= 
#innodb_rollback_on_timeout 
#innodb_rollback_segments=128 
#**********************MyISAM**************************
#******feature
#myisam_data_pointer_size= 
#myisam_use_mmap 
#keep_files_on_create 
myisam-block-size=4096 #控制索引文件中块的大小
delay-key-write=on #是指在表关闭之前,将对表的update操作指跟新数据到磁盘,而不更新索引到磁盘,把对索引的更改记录在内存。
#preload_buffer_size 
myisam_stats_method=nulls_unequal  #定义在为MyISAM表收集索引分布相关的统计信息时处理NULL值的方式。nulls_equal表示所有的NULL值都视作相同值,nulls_unequal表示所有的NULL值都视作不同值,nulls_ignored表示所有的NULL值都将被忽略。作用范围为全局或会话级别,可用于配置文件,属动态变量。
#myisam-recover-options=OFF 
myisam_repair_threads=1 #如果该值大于1,在Repair by sorting过程中并行创建MyISAM表索引(每个索引在自己的线程内)
#******buffer&cache
key_buffer_size=64M  #指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。
key_cache_block_size=4096  #每一个索引block的大小,默认1024字节,从4.1.1后才出现这个参数,原来都是直接采用1024字节作为Block的长度
key_cache_age_threshold=300 #如果key_buffer里的热链里的某个缓存块在这个变量所设定的时间里没有被访问过,MySQL服务器就会把它调整到暖链里去。这个参数值越大,缓存块在热链里停留的时间就越长。这个参数默认值为 300,最小值为100。
key_cache_division_limit=20  #缓存结构体变量的组件部分,因此它是每个缓存都可以设置这个参数值
#read_buffer_size=1m 
#read_rnd_buffer_size=2m
read_buffer_size=4m     #for mariadb  是MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能
#公式key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = ?
read_rnd_buffer_size=8m #for mariadb MySQL的随机读缓冲区大小,当按任意顺序读取行时(列如按照排序顺序)将分配一个随机读取缓冲区,进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要大量数据可适当的调整该值,但MySQL会为每个客户连接分配该缓冲区所以尽量适当设置该值,以免内存开销过大。表的随机的顺序缓冲 提高读取的效率。

myisam_sort_buffer_size=32m  #MyISAM表发生变化时重新排序所需的缓冲。一般64M足矣。
#*******delayed insert
#delayed_queue_size= 
#max_delayed_threads= 
#delayed_insert_limit= 
#delayed_insert_timeout= 
#******fulltext
#ft_boolean_syntax= 
#ft_max_word_len= 
#ft_min_word_len= 
#ft_query_expansion_limit= 
#ft_stopword_file=file_name 
#******limitation
bulk_insert_buffer_size=8m  #调整 bulk_insert_buffer_size 参数来提高数据插入的效率,这个参数设置的是 bulk insert 的缓存大小,默认是 8M 。
myisam_max_sort_file_size=10G #MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
#myisam_mmap_size= 
#******lock&concurrency
#external-locking 
skip-external-locking #当外部锁定(external-locking)起作用时,每个进程若要访问数据表,则必须等待之前的进程完成操作并解除锁定。由于服务器访问数据表时经常需要等待解锁,因此在单服务器环境下external locking会让MySQL性能下降。所以在很多Linux发行版的源中,MySQL配置文件中默认使用了skip-external-locking来避免external locking。
concurrent_insert=AUTO #当一个线程对一个表执行一个DELAYED语句时,如果不存在这样的处理程序,一个处理器线程被创建以处理对于该表的所有DELAYED语句。
#当concurrent_insert=0时,不允许并发插入功能。
#当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。
#当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。
#skip-concurrent-insert 
max_write_lock_count=10000 #控制写的优先级,当一个表的读锁达到这个数的时候,MySQL会暂时的,降低写的优先级.MySQL尽量少用一些看似精妙但复杂的语句,因为你复杂可能导致给表加的读锁时间就长,会导致写的操作无法进行.
#low-priority-updates 
#********************performance_schema****************
performance_schema=0   # change from 1 to to default value on 20150211 PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的,需要手动开启,在配置文件里添加
#performance_schema_events_waits_history_long_size= 
#performance_schema_events_waits_history_size= 
#performance_schema_max_cond_classes= 
#performance_schema_max_cond_instances= 
#performance_schema_max_file_classes= 
#performance_schema_max_file_handles= 
#performance_schema_max_file_instances= 
#performance_schema_max_mutex_classes= 
#performance_schema_max_mutex_instances= 
#performance_schema_max_rwlock_classes= 
#performance_schema_max_rwlock_instances= 
#performance_schema_max_table_handles= 
#performance_schema_max_table_instances= 
#performance_schema_max_thread_classes= 
#performance_schema_max_thread_instances= 


#**************************federated********************
#federated
[mysqldump]
quick
max_allowed_packet = 2G #MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受         max_allowed_packet 参数限制,导致写入或者更新失败。
log-error=/data/mysqllog/dump.log  #mysqldump的错误日志保存路径
net_buffer_length=8k

[mysql]
no-auto-rehash
no-beep
default-character-set = utf8
socket=/data/mysqldata/mysql.sock
#prompt="\\@\\h \\d \\R:\\m:\\s> "
#tee="/apps/logs/mysql/audit.log" 
#pager="less -i -n -S" 
net_buffer_length=64K
unbuffered
max_allowed_packet = 2G # add by alading on 20151110

[mysqladmin]
default-character-set = utf8
socket=/data/mysqldata/mysql.sock

[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = 65535
Last modification:November 10th, 2020 at 04:12 pm
如果觉得我的文章对你有用,请随意赞赏