首页 > 代码库 > mysql参数优化

mysql参数优化

mysql参数优化

innodb_buffer_pool_size:

先写入innodb_log_buffer
buffer写满或事务提交,刷新数据
大事务频繁,增加innodb_log_buffer_size大小,对于单独的MySQL数据库服务器推荐设为物理内存的75%

-------------------------------------------

innodb_buffer_pool_instances:

将innodb_buffer_pool划分为不同的instance
每个instance独立的LRU、FLUSH、FREE
独立的mutex控制
--------------------------------------------

innodb_log_file_size :

在mysql 5.5和5.5以前innodb的logfile最大设置为4GB,在5.6以后的版本中logfile最大的可以设为512GB.
innodb的logfile就是事务日志,用来在mysql crash后的恢复.所以设置合理的大小对于mysql的性能非常重要
在5.5的版本中,default设置为5M.在新建的mysql服务器中,需要尽快修改该参数.

--------------------------------------------

innodb_log_buffer_size:

先写入innodb_log_buffer
buffer写满或事务提交,刷新数据
大事务频繁,增加innodb_log_buffer_size大小

--------------------------------------------

innodb_thread_concurrency(并发线程) :

innodb_thread_concurrency = 0,innodb内部自己控制
–kernel_mutex竞争
–CPU上下文切换
innodb_thread_concurrency设置为cpu的核心数

--------------------------------------------

innodb_io_capacity :

innodb每秒后台进程处理IO操作的数据页上限
innodb_buffer_pool_size总的io处理能力上限
innodb_buffer_pool_instances分割成多个内存块时,每个内存块的IO处理能力为:innodb_io_capacity/innodb_buffer_pool_instances
--------------------------------------------

innodb_max_dirty_pages_pct :

innodb从innodb buffer中刷新脏页的比例
刷新脏页,产生checkpoint
脏页刷新innodb_max_dirty_pages_pct * innodb_io_capacity
---------------------------------------------

innodb_flush_method :

O_DSYNC:使用O_SYNC打开和刷新log文件,使用fsync()刷新数据文件。
O_DIRECT:使用O_DIRECT打开数据文件,使用fsync()刷新日志文件和数据文件。
在raid设备上,为了避免数据被innodb_buffer和raid多次cache,设置为O_DIRECT方式。

---------------------------------------------

innodb_file_per_table :

不同的表空间可以灵活设置数据目录的地址
避免共享表空间产生的IO竞争

------------------------------------------

innodb_flush_log_at_trx_commit  :

0:每秒将log buffer的内容与事务日志并数据刷盘;-----------------------最快数据最不安全

1:每个事务提交后,将log_buffer的内容写事务日志并数据刷盘;-----------最慢最安全

2:每个事务提交后,将log_buffer的内容写事务日志,但不进行数据刷盘;---折中

------------------------------------------

sync_binlog :

请注意如果在autocommit模式,每执行一个语句向二进制日志写入一次,否则每个事务写入一次。 默认值是0,不与硬盘同步。值为1是最安全的选择,因为崩溃时,你最多丢掉二进制日志中的一个语句/事务;但是,这是最慢的选择。

双1模式,即innodb_flush_log_at_trx_commit=1,sync_binlog=1 这样主备库的数据是一致的,不会丢失数据。(在此请问你考虑到IO负载了吗?)

 

当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写能力有限,无复制或允许复制延迟稍微长点能接受,例如:日志性登记业务;

----------------------------------------

key_buffer_size :

key_buffer_size只能缓存MyISAM或类MyISAM引擎的索引数据,而innodb_buffer_pool_size不仅能缓存索引数据,还能缓存元数据,但是对于我们只使用InnoDB引擎的数据库系统而言,此参数值也不能设置过于偏小,因为临时表可能会使用到此键缓存区空间,索引缓存区推荐:64M

----------------------------------------

query_cache_type  and query_cache_size :

query_cache_type=N:

N=0  —- 禁用查询缓存的功能;

(有人认为mysql的query cache大部分情况下其实只是鸡肋而已,而且建议全面禁用 ; 总之,如果线上环境中99%以上都是只读,很少有更新,再考虑开启QC吧,否则,就别开了。详见 http://www.wtoutiao.com/p/r9aGUI.html)

N=1  —- 启用产讯缓存的功能,缓存所有符合要求的查询结果集,除SELECT SQL_NO_CACHE.., 以及不符合查询缓存设置的结果集外;

N=2  —- 仅仅缓存SELECT SQL_CACHE …子句的查询结果集,除不符合查询缓存设置的结果集外;

query_cache_size:

查询缓存设置多大才是合理?至少需要从四个维度考虑:

①   查询缓存区对DDL和DML语句的性能影响;

②   查询缓存区的内部维护成本;

③   查询缓存区的命中率及内存使用率等综合考虑

④   业务类型

----------------------------------------

max_connections :

MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。

数值过小会经常出现ERROR 1040: Too many connections错误,可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。

show variables like ‘max_connections‘ ;  查看当前最大连接数设置值

show  status like ‘max_used_connections‘ ; 查看最大响应的连接数

如下:

mysql> show variables like ‘max_connections‘;

+———————–+——-+

| Variable_name | Value |

+———————–+——-+

| max_connections | 256  |

+———————–+——-+

mysql> show status like ‘max%connections‘;

+———————–+——-+

| Variable_name       | Value |

+—————————-+——-+

| max_used_connections | 256|

+—————————-+——-+

max_used_connections / max_connections * 100% (理想值≈ 85%) 

如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。

修改方法:  vim  /etc/my.cnf(永久生效)  或者直接修改会话全局变量(临时即时生效,重启mysql后失效,恢复原样)。所以建议修改指定参数后,同样修改my.cnf保持一致。

[mysqld]

max_connections=1000

----------------------------------------

mysql参数优化