MySQL有两种途径途径了解其的配置参数,一个是MySQL交互模式下的命令SHOW VARIABLES,一个使用mysqladmin variables 查询。html
MySQL的配置参数分为2种,全局的和局部的。局部的配置变量能够在每次会话中本身更改。mysql
从MySQL 4.0之后开始,在SHOW VARIABLES中显示的参数,大部分能够动态使用SET命令进行更改。sql
基本参数配置:数据库
参数windows |
说明数组 |
bind-address缓存 |
绑定的IP地址安全 |
user服务器 |
用户网络 |
port |
端口号 |
datadir |
数据文件目录 |
basedir |
msyql应用程序的目录 |
socket |
socket文件,默认在/tmp目录下,可是建议不要这样设置,/tmp目录是一个你们都愿意破坏的目录 |
default-table-type |
默认表类型 |
查询的Cache的是从MySQL4.0版本开始提供的功能。相关的参数为:
参数 |
说明 |
query_cache_size |
查询Cache的尺寸 |
query_cache_type |
查询的Cache类型。 0 OFF,不进行缓冲 1 ON,进行缓冲 2 DEMAND,对SELECT SQL_CACHE开头的查询进行缓冲 |
query_cache_limit |
查询的结果的限制长度,小于这个长度的数据才能Cache |
MyISAM的索引参数:key_buffer_size为MyISAM引擎的最关键的优化参数之一。
参数 |
说明 |
key_buffer_size |
(关键参数),索引块用的缓冲区大小,全部的链接程序线程共用 |
key_cache_block_size |
每个索引block的大小,默认1024字节,从4.1.1后才出现这个参数,原来都是直接采用1024字节做为Block的长度 |
InnoDB使用的参数:InnoDB的参数较少,笼统而不细致,内存的管理多由InnoDB引擎本身负责,主要的缓冲就是innodb_buffer_pool_size参数分配的缓冲。这样配置却是简单了,但没有了细致优化乐趣。
参数 |
说明 |
innodb_buffer_pool_size |
innodb的缓冲区大小,存放数据和索引,通常设置为机器内存的50%-80% (关键参数) |
innodb_log_buffer_size |
InnoDB日志缓冲区大小 |
innodb_flush_method |
刷新日志的方法 |
innodb_additional_mem_pool_size |
innodb内存池的大小,存放着各类内部使用的数据结构 |
innodb_data_home_dir |
InnoDB数据文件的目录 |
innodb_data_file_path |
数据文件配置 |
innodb_log_files_in_group |
Innodb日志的 |
innodb_log_file_size |
Innodb日志文件的尺寸 |
innodb_lock_wait_timeout |
等待数据锁的超时时间,避免死锁的一种措施 |
innodb_flush_log_at_trx_commit |
日志提交方式 (关键参数) 0每秒写1第二天志,将数据刷入磁盘,至关于每秒提交一次事务。 1每次提交事务写日志,同时将刷新相应磁盘,默认参数。 2每提交事务写一第二天志,但每隔一秒刷新一次相应的磁盘文件[注] |
innodb_force_recovery |
在Innodb的自动恢复失败后,从崩溃中强制启动,有1-6个级别,数值越低恢复的方式也保守,默认为4。尽可能使用较保守方式恢复。 恢复后要注释删除这一行。 |
Log的参数:MySQL的日志有6种,查询日志,慢查询日志,变动日志,二进制变动日志,告警日志,错误日志。my.cnf中能够配置日志的前缀和日志参数。日志是监控数据库系统的重要途径。
参数 |
说明 |
log |
查询日志,记录全部的MySQL的命令操做,在跟踪数据库运行时很是有帮助,但在实际环境中就不要使用了 |
log-update |
变动日志,用文本方式记录全部改变数据的变动操做, |
log-bin |
二进制变动日志,更加紧凑,使用mysqlbinlog读取,操做,转换 |
binlog_cache_size |
临时存放某次事务的SQL语句缓冲长度 |
max_binlog_cache_szie |
最大的二进制Cache日志缓冲区尺寸 |
max_binlog_size |
最大的二进制日志尺寸 |
log-error |
致使没法启动的错误日志 |
log-warnings |
告警日志 |
long_query_time |
慢查询时间限度,超过这个限度,mysqld认为是一个慢查询 |
log-queries-not-using-indexes |
没有使用索引查询的日志,方便记录长时间访问的查询进行优化 |
log-slow-queries |
慢速的查询日志, |
打开文件参数:
参数 |
说明 |
table_cache |
可以被同时打开的表最大个数,打开一个表使用2个文件描述符 (关键参数) |
open_files_limit |
mysqld保留的文件描述符号个数,和table_cache和max_connections设置相关,默认为0 设置为0, 系统设置max_connections*5或者max_connections + table_cache*2中的最大值 |
关于链接通讯的参数:
参数 |
说明 |
max_connections |
最大的链接数 |
max_connect_errors |
同一个地址最大错误链接数,防止攻击用 |
net_buffer_length |
服务器和客户之间通信的使用的缓冲区长度 |
max_allowed_packet |
服务器和客户之间最大的通讯的缓冲区长度 |
net_read_timeout |
网络读取超时 |
net_write_timeout |
网络写入超时 |
interactive_timeout |
交互模式下的没有操做后的超时时间 |
wait_ timeout |
非交互模式的没有操做后的超时时间 |
每一个会话使用的buffer设置,默认使用my.cnf的配置,也可使用每一个会话设置。不要设置的过大。
参数 |
说明 |
read_buffer_size (record_buffer) |
对数据表做顺序读取的缓冲大小 |
read_rnd_buffer_size |
在排序后,读取结果数据的缓冲区大小, |
sort_buffer_size (sort_buffer) |
用来完成排序操做的线程使用的缓冲区大小 |
join_buffer_size |
全关联操做缓冲区(没有索引而进行关联操做) |
write_buffer_size |
myisamchk的特有选项 写入缓冲区大小 |
myisam_sort_buffer_szie |
为索引的从新排序操做(好比CREATE INDEX)的分配的缓冲区的长度 |
对于磁盘缓式写入的一些选项,delay_key_write,flush,flush_time参数可能能够进一步提升MyISAM引擎的性能,可是在服务器Crash的时候,可能会丢失数据,形成表损坏。
MySQL对于插入语句支持一个选项INSERT DELAYED,若是有这个选项,MySQL将这些插入语句放入一个队列,并不立刻读入磁盘。delay_insert_XXX的选项都是配置这个功能,
MySQL建立表的时候也有一个选项,DELAY_KEY_WRITE,有这个选项描述的表的键发生改动后,改动能够缓冲在key_buffer中,不当即回写磁盘。
参数 |
说明 |
delay_insert_limit |
INSERT DELAYED语句选项。(插入语句的描述) 处理INSERT DELAYED语句,MYSQL插入delay_insert_limit条语句后检查是否有查询语句,若有有去查询,若是没有,则继续插入 |
delay_insert_timeout |
在处理完INSERT DELAYED对列的插入数据后,MYSQL等待delay_insert_timeout秒后看看是否有INSERT DELAYED数据,若是有继续,若是没有结束此次操做。 |
delay_query_size |
INSERT DELAYED插入数据对列的长度 |
max_delayed_threads |
处理INSERT DELAYED语句的最大线程个数 |
delay_key_write |
对于使用DELAY_KEY_WRITE选项的建立的表,能够延缓键读写 0N 不延缓全部的键写如操做 OFF延缓有DELAY_KEY_WRITE选项的标的键写入操做 ALL延缓全部的表 |
flush |
是否要在每一个操做后当即刷新数据表 |
flush_time |
每隔多少秒,对数据表进行一次刷新。关闭后打开。 |
|
|
关闭某些选项:关闭某些选项能够加快MySQL的运行速度,这些选项在MySQL SHOW VARIABLES 中显示为have_XXX 的变量。
参数 |
说明 |
skip-openssl |
关闭mysql服务器对SSL加密的支持 |
skip-isam |
关闭mysql服务器对isam的引擎的支持 |
skip-bdb |
关闭mysql服务器对bdb的引擎的支持 |
skip-external-locking |
不使用外部锁,MySQL的外部锁用于防止其余程序修改正在数据文件,但其在部分系统上不可靠,通常都不使用。(4.03版本前叫skip-locking) |
skip-innodb |
关闭mysql服务器对innodb的引擎的支持 |
skip_networking |
只能从本地访问数据库 |
|
|
其余参数:
参数 |
说明 |
slow_launch_time |
用多于这个时间建立的线程视为一个慢建立线程 |
binlog_cache_size |
临时存放构成每次事务的SQL的缓冲区长度,(全局变量,可是应该影响每个会话) |
max_binlog_cache_size |
二进制日志缓冲区的最大长度,其实就是事物的最大长度,默认4G |
max_heap_table_size |
HEAP表的最大容许长度 |
max_tmp_tables |
临时tables的最大个数 |
myisam_recover_options |
myisam引擎的自动恢复模式 |
thread_cache_size |
线程缓冲区的所能容纳的最大线程个数 |
tmp_table_size |
临时tables的最大尺寸 |
MySQL有两种途径途径了解其的运行状态,一个是MySQL交互模式下的命令SHOW STATUS,一个使用mysqladmin extended-status 。两种方法殊途同归,经过观察其运行状态能够了解咱们的参数设置是否合理,是否有要优化的表和数据。
SHOW STATUS显示了MySQL从运行开始到如今为止状态,大部分为一些计数器,使用FLUSH STATUS能够从新对各类状态变量进行计数。
表19 MySQL的状态计数器
参数 |
说明 |
Aborted_clients |
因客户没有正确关闭而丢弃的链接数量,没有正确关闭指没有调用mysql_close就退出,链接超时,数据传送中客户端退出 |
Aborted_connects |
试图链接MySQL服务器但没有成功的次数 |
Connections |
试图链接MySQL服务器的尝试次数,(包括成功的和没有成功) |
|
|
Com_XXX |
执行语句的计数器,好比Com_select变量记录了select语句的个数 |
|
|
Created_tmp_disk_tables |
使用磁盘建立临时表的次数,若是要建立的临时表的尺寸大于tmp_table_size,那么临时表将建立在磁盘上, |
Created_tmp_tables |
建立临时表的次数 |
|
|
Delayed_XXX |
INSERT DELAYED语句的执行性能参数 |
|
|
Opened_tables |
曾经打开过的数据表总数 |
Open_tables |
当前处于打开的表个数 |
Open_files |
当前处于打开的文件个数 |
|
|
Bytes_received |
从客户收到的字节总数 |
Bytes_send |
发送给客户的字节总数 |
|
|
Handler_commit Handler_rollback |
事务提交或者回滚的次数 |
Handler_delete |
对数据表删除一条记录的次数 |
Handler_update |
对数据表修改一条记录的次数 |
Handler_write |
对数据表插入一条记录的次数 |
Handler_read_first |
读取索引中第一个索引项的个数 |
Handler_read_key |
根据索引直接读取一行数据的次数,这个数值高表示数据库有较好的检索能力。 |
Handler_read_next |
根据索引读取下个数据行的请求次数. 在一个索引的区间内进行查询( > < ,orderby 这类查询条件)会影响这个计数器。 |
Handler_read_prev |
根据索引读取前个数据行的请求次数.用于一些反序查询。 |
Handler_read_rnd |
经过一个固定位置(应该就是不经过索引)读取一个数据行的次数。这个数值很高表示你的不少查询操做的结果须要排序,可能这些查询操做不能适当使用索引而要检索整个表。 |
Handler_read_rnd_next |
请求从数据文件中读取下一个记录的次数.若是有不少全表的检索这个值将很高. 一般这表示数据表没有合适的索引。 |
|
|
key_blocks_used |
索引缓冲区块中已经被使用的区块大小。Block的尺寸默认是1024字节,4.1.1后能够经过key_cache_block_size参数设置。能够根据key_buffer_size/(1024 or key_cache_block_size) 获得Block总数,而后知道key_buffer的利用率 |
Key_read_requests |
从缓冲读取1个Block的次数 |
Key_read |
从磁盘读取的次数 |
Key_write_requests |
写入索引缓冲区写入一个Block的次数 |
Key_write |
写回磁盘的次数 |
|
|
Qcache_free_blocks |
Qcache没有使用的内存块个数 |
Qcache_free_memory |
Qcache没有使用的内存尺寸 |
Qcache_hits |
查询在Qcache中的命中次数,和Com_select比较,就能够知道Qache的大约命中率是多少。 |
Qcache_inserts |
加入Cache中的查询个数 |
Qcache_lowmem_prunes |
因为Qcache不够用,形成替换出Qcache的查询个数 |
Qcache_not_cached |
没有能Cache的查询个数 |
|
|
Slow_queries |
慢查询的次数,若是一个查询的所用的时间大于long_query_time设置的时间,则计数加1 |
|
|
Select_XXXX |
关联查询的一些状态计数 |
|
|
Innodb_XXXX |
InnoDB的状态技术器,不过只有MySQL 5.02的版本才支持这些计数器。这儿略过 |
|
|
Table_locks_waited |
必须等待后才能完成表锁定的请求个数,若是这个数值和下面数值的比率过大,表示数据库的性能较低 |
Table_locks_immediate |
无需等待,当即完成表锁定的请求个数。 |
|
|
Thread_connected |
如今处在链接打开状态的线程个数 |
Thread_cached |
如今在现场缓冲区的线程个数 |
Thread_created |
到目前为止,建立的线程个数 |
Thead_running |
如今运行的线程个数,不是全部打开的线程都在运行,有些会处于SLEEP状态 |
InnoDB的状态监控的要在交互模式下使用show innodb status命令。相对的能够利用InnoDB状态参数也过少。
一、 innodb_flush_log_at_trx_commit AND sync_binlog
innodb_flush_log_at_trx_commit = N:
N=0 – 每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;
N=1 – 每一个事务提交时候,把事务日志从缓存区写到日志文件中,而且刷新日志文件的数据到磁盘上;
N=2 – 每事务提交的时候,把事务日志数据从缓存区写到日志文件中;每隔一秒,刷新一第二天志文件,但不必定刷新到磁盘上,而是取决于操做系统的调度;
sync_binlog = N:
N>0 — 每向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上;
N=0 — 不主动刷新二进制日志文件的数据到磁盘上,而是由操做系统决定;
推荐配置组合:
N=1,1 — 适合数据安全性要求很是高,并且磁盘IO写能力足够支持业务,好比充值消费系统;
N=1,0 — 适合数据安全性要求高,磁盘IO写能力支持业务不富余,容许备库落后或无复制;
N=2,0或2,m(0<m<100) — 适合数据安全性有要求,容许丢失一点事务日志,复制架构的延迟也能接受;
N=0,0 — 磁盘IO写能力有限,无复制或容许复制延迟稍微长点能接受,例如:日志性登记业务;
二、 innodb_file_per_table
启用单表空间,减小共享表空间维护成本,减小空闲磁盘空间释放的压力。另外,大数据量状况下 的性能,也会有性能上的提高,为此建议你们使用独立表空间 代替 共享表空间的方式;
三、 key_buffer_size
key_buffer_size只能缓存MyISAM或类MyISAM引擎的索引数据,而innodb_buffer_pool_size不只能缓存索引数据,还能缓存元数据,可是对于咱们只使用InnoDB引擎的数据库系统而言,此参数值也不能设置过于偏小,由于临时表可能会使用到此键缓存区空间,索引缓存区推荐:64M;
四、 query_cache_type and query_cache_size
n query_cache_type=N
N=0 —- 禁用查询缓存的功能;
N=1 —- 启用产讯缓存的功能,缓存全部符合要求的查询结果集,除SELECT SQL_NO_CACHE.., 以及不符合查询缓存设置的结果集外;
N=2 —- 仅仅缓存SELECT SQL_CACHE …子句的查询结果集,除不符合查询缓存设置的结果集外;
n query_cache_size
查询缓存设置多大才是合理?至少须要从四个维度考虑:
① 查询缓存区对DDL和DML语句的性能影响;
② 查询缓存区的内部维护成本;
③ 查询缓存区的命中率及内存使用率等综合考虑
④ 业务类型
五、 innodb_commit_concurrency
含义:同一时刻,容许多少个线程同时提交InnoDB事务,默认值为0,范围0-1000。
0 — 容许任意数量的事务在同一时间点提交;
N>0 — 容许N个事务在同一时间点提交;
注意事项:
① mysqld提供服务时,不准把 innodb_commit_concurrency 的值从0改成非0,或非0的值改成0;
② mysqld提供时,容许把 innodb_commit_concurrency 的值N>0改成M,且M>0;
六、 innodb_concurrency_tickets
含义:
同一时刻,能访问InnoDB引擎数据的线程数,默认值为500,范围1-4294967295。
补充说明:当访问InnoDB引擎数据的线程数达到设置的上线,线程将会被放到队列中,等待其余线程释放ticket。
建议:
MySQL数据库服务最大线程链接数参数max_connections,通常状况下都会设置在128-1024的范围,再结合实际业务可能的最大事务并发度,innodb_concurrency_tickets保持默认值通常状况下足够。
七、 innodb_fast_shutdown and innodb_force_recovery
innodb_fast_shutdown:
含义:设置innodb引擎关闭的方式,默认值为:1,正常关闭的状态;
0 — mysqld服务关闭前,先进行数据彻底的清理和插入缓冲区的合并操做,如果脏数据
较多或者服务器性能等因素,会致使此过程须要数分钟或者更长时间;
1 — 正常关闭mysqld服务,针对innodb引擎不作任何其余的操做;
2 — 如果mysqld出现崩溃,当即刷事务日志到磁盘上而且冷关闭mysqld服务;没有提交
的事务将会丢失,可是再启动mysqld服务的时候会进行事务回滚恢复;
innodb_force_recovery:
含义:
mysqld服务出现崩溃以后,InnoDB引擎进行回滚的模式,默认值为0,可设置的值0~6;
提示:
只有在须要从错误状态的数据库进行数据备份时,才建议设置innodb_force_recovery的值大于0。 如果把此参数做为安全选项,也能够把参数的值设置大于0,防止InnoDB引擎的数据变动,设置不一样值的做用:
0 — 正常的关闭和启动,不会作任何强迫恢复操做;
1 — 跳过错误页,让mysqld服务继续运行。跳过错误索引记录和存储页,尝试用
SELECT * INOT OUTFILE ‘../filename’ FROM tablename;方式,完成数据备份;
2 — 阻止InnoDB的主线程运行。清理操做时出现mysqld服务崩溃,则会阻止数据恢复操做;
3 — 恢复的时候,不进行事务回滚;
4 — 阻止INSERT缓冲区的合并操做。不作合并操做,为防止出现mysqld服务崩溃。不计算
表的统计信息
5 — mysqld服务启动的时候不检查回滚日志:InnoDB引擎对待每一个不肯定的事务就像提交
的事务同样;
6 — 不作事务日志前滚恢复操做;
推荐的参数组合配置:
innodb_fast_shutdown = 1
#如果机房条件较好可设置为0(双路电源、UPS、RAID卡电池和供电系统稳定性)
innodb_force_recovery =0
#至于出问题的时候,设置为什么值,要视出错的缘由和程度,对数据后续作的操做
八、 innodb_additional_mem_pool_size
含义:开辟一片内存用于缓存InnoDB引擎的数据字典信息和内部数据结构(好比:自适应HASH索引结构);
默认值:build-in版本默认值为:1M;Plugin-innodb版本默认值为:8M;
提示:如果mysqld服务上的表对象数量较多,InnoDB引擎数据量很大,且innodb_buffer_pool_size的值设置 较大,则应该适当地调整innodb_additional_mem_pool_size的值。如果出现缓存区的内存不足,则会直接向操做系统申请内存分配,而且会向MySQL的error log文件写入警告信息;
九、 innodb_buffer_pool_size
含义:开辟一片内存用于缓存InnoDB引擎表的数据和索引;
默认值:历史默认值为:8M,如今版本默认值为:128M;
参数最大值:受限于CPU的架构,支持32位仍是支持64位,另外还受限于操做系统为32位仍是64位;
提示:
innodb_buffer_pool_size的值设置合适,会节约访问表对象中数据的物理IO。官方手册上建议专用的数据库服务器,可考虑设置为物理内存总量的80%,可是我的建议要看物理服务器的物理内存总量,以及考虑: 是否只使用InnoDB引擎、mysqld内部管理占用的内存、最大线程链接数和临时表等因素,官方提供的80%值做为一个参考,举而个例子方便你们做决定(前提:物理服务器为mysqld服务专用,且只用InnoDB引擎,假设数据量远大于物理内存):
1).内存配置:24G 则 innodb_buffer_pool_size=18G
1).内存配置:32G 则 innodb_buffer_pool_size=24G
出现下列哪些状况,则能够考虑减少innodb_buffer_pool_size的值:
1).出现物理内存的竞争,可能致使操做系统的分页;
2).InnoDB预分配额外的内存给缓冲区和结构管理,当分配的总内存量超过innodb_buffer_pool_size值的10%;
3).地址空间要求必须为连续的,在windows系统有一个严重问题,DLL须要加载在特定的地址空间;
4).初始化缓冲区的时间消耗,与缓冲区的大小成正比。官方提供的数据 Linux X86 64位系统 初始化 innodb_buffer_pool_size=10G 大概须要6秒钟;
十、 lower_case_table_names
Linux或类Unix平台,对文件名称大小写敏感,也即对数据库、表、存储过程等对象名称大小写敏 感,为减小开发人员的开发成本,为此推荐你们设置该参数使对象名称都自动转换成小写;
十一、 max_connect_errors
max_connect_errors默认值为10,也即mysqld线程没从新启动过,一台物理服务器只要链接 异常中断累计超过10次,就再也没法链接上mysqld服务,为此建议你们设置此值至少大于等于10W; 若异常中断累计超过参数设置的值,有二种解决办法,执行命令:FLUSH HOSTS;或者从新启动mysqld服务;
十二、 interactive_timeout and wait_timeout
u interactive_timeout
处于交互状态链接的活动被服务器端强制关闭,而等待的时间,单位:秒;
u wait_timeout
与服务器端无交互状态的链接,直到被服务器端强制关闭而等待的时间,此参数只对基于TCP/IP或基于 Socket通讯协议创建的链接才有效,单位:秒;
u 推荐设置
interactive_timeout = 172800
wait_timeout = 172800
1三、 transaction-isolation and binlog-format
u transaction-isolation
可供设置的值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、
SERIALIZABLE,默认的值为: REPEATABLE-READ,事务隔离级别设置的不一样,对二进制日志登记格
式影响很是大,详细信息可见文章解读MySQL事务的隔离级别和日志登记模式选择技巧;
u binlog-format
复制的模式,可供设置的值:STATEMENT、ROW、MIXED(注:5.0.*只有命令行式复制),
5.1.*版本默认设置:MIXED;
u 推荐配置
① 只读为主的业务应用场景
transaction-isolation = read-committed
binlog-format = mixed #5.1.*版本,5.0.*只能设置为 statement
① 非只读为主的业务应用场景
transaction-isolation = repeatabled-read
binlog-format = mixed #5.1.*版本,5.0.*只能设置为 statement
1四、 event_scheduler
事务调度默认是关闭状态,也推荐源码编译的版本可不编译进来,以及实际生产环境保持默认禁用 状态,当真正须要用的时候,能够临时打开,命令:SET GLOBAL event_scheduler=1;
1五、 skip_external_locking
外部锁,也即操做系统所实施的锁,只对MyISAM引擎有效,且容易形成死锁发生,为此咱们一概禁用;
1六、 innodb_adaptive_hash_index
InnoDB引擎会根据数据的访问频繁度,把表的数据逐渐缓到内存,如果一张表的数据大量缓存在 内存中,则使用散列索引(注:Hash Index)会更高效。InnoDB内有Hash Index机制,监控数据的访 问状况,能够自动建立和维护一个Hash Index,以提供访问效率,减小内存的使用;
1七、 innodb_max_dirty_pages_pct
InnoDB主线程直接更新Innodb_buffer_pool_size中存在的数据,而且不实时刷回磁盘,而是等待 相关的处罚事件发生,则容许缓存空间的数据量不实时刷回磁盘的最大百分比。比例设置较小,有利于 减小mysqld服务出现问题的时候恢复时间,缺点则是须要更多的物理I/O,为此咱们必须根据业务特色 和可承受范围进行一个折中,通常范围建议设置为5%~90%,像咱们SNS游戏行业的写很是厉害,综合 各方面因素,设置为20%;