配置文件一般在/etc/my.cnf或者是/etc/mysql/my.cnf
语法:properties的语法,注意单词用-或_分割比如:
auto-increment-offset=5
分个类
按照作用域,可以分为全局的也就是配置在配置文件中的,或者是会话的,就是连接中的
还可分为动态和静态的。 动态就是在运行期间可以改写的,这个要特别小心,因为有可能造成全局刷新和阻塞
语法:
SHOW variables like '%sort_buffer_size%';
//全局的:
SET GLOBAL sort_buffer_size = <value>;
SET @@global.sort_buffer_size := <value>;
// 会话的
SET @@sort_buffer_size := <value>;
SET @@ssession.sort_buffer_size := <value>;
对于value还有一个些其他的限制,比如
SET 不能用1M
配置文件不能用表达式。 这些需要注意。
innodb_buffer_pool_size
这个参数主要缓存innodb表的索引,数据,插入数据时的缓冲。
Mysql整体可用内存的70%-80%,太大了可能会占用操作系统内存,影响性能。
可以使用show engine innodb status;展示的
BUFFER POOL AND MEMORY
查看使用情况
事务日志
数据被修改,先写日志缓冲区。 缓冲区满|每秒|事务提交, 缓冲区回写事务日志。
innodb_log_buffer_size 设置缓冲区大小。
设置原则:2-8M,一般满足一个小时的活动。活动大小:
show global status like '%Innodb_os_log_written%';
查看写入日志增量。 可以隔100计算,算两次差值。 单位为B。
最佳实践:3M
innodb_log_files_in_group 几个日志文件。默认2.一般不用改
innodb_log_file_size 日志文件大小。 又一个比较有用的参数。
官方建议 innodb_log_files_in_group * innodb_log_file_size = innodb_buffer_pool_size。
太大会使得恢复速度很慢
另外该值也没有要设置太大,跟checkpoint的频率有关(checkpoint是一个后台线程),会把事务日志中的数据写到数据文件中。
可以使用
show engine innodb status; 命令查看这部分:
LOG
Log sequence number 300 2512389215
Log flushed up to 300 2512389215
Last checkpoint at 300 2508134796
2512389215 - 2508134796 = 4m多。
有个官方推荐的公式(innodb_log_file_size*innodb_log_files_in_group(default 2))*0.75 = 4M
因为是测试环境所以没什么感觉,但实际上一般是几G才够用的。
innodb_flush_logs_at_trx_commit
0 缓冲写日志每秒一次
1 默认 最安全,每次提交写日志,且刷新(刷新到持久化存储)。
2 缓冲写日志每次提交时写,每秒一次刷新
上面缓冲写日志,实际上是从InnoDB的 缓存转移到操作系统的缓存
如果允许1秒的丢失的话,实际上是可以使用2的
并发配置
innodb_thread_concurrency 限制一次性可以有多少线程进入内核。
其值 = CPU数量 * 磁盘数量 * 2, 实际上小点效果会更好。
超过的线程会使用两阶段方式,先睡一定的微秒再尝试进入,如果还不能则进入队列。
一单进入内核那就有一定数量的tiket,下次可以直接进入内核。
innodb_commit_concurrency变量控制有多少个线程可以同一时间提交。
max_connection
防止攻击, 但是要设置足够大,免得正常业务被拒绝。
show variables like 'max_connections';
show global status like 'Max_used_connections';
观察Max_used__connections的值,能看到是否有时间点超过了最大值。
thread_cache_size
缓存线程的值,不用很大一般256就可以了
show global status like 'Threads_connected';
show global status like 'Threads_created';
如果Threads_created这个值很大或者一直增长,则需要增到配置了
table_cache_size
要足够大,避免需要重复解析打开表定义
show global status like 'Opened_tables';
这个值变化大,则需要增加
其他配置
read_only 在备库使用,强制备库不接受应用端来的变更请求
slave_net_timeout 备库连主库发现失败时间,默认一个小时,一般一分钟或更短。
innodb_autoinc_lock_mode 自增锁的模式
sort_buffer_size 8M
join_buffer_size 两个connection级别的参数,每次新的连接创建,太大可能占用太多内存,一般 2M
query_cache_size 查询缓存大小,因为会有锁,命中率等等问题。实际上用处并不是很大。一般32M
transaction_isolation 默认隔离级别。
key_buffer_size 索引缓冲区大小,可以大一点 512M
read_buffer_size查询操作缓冲区,排序时,会查一遍该缓冲区,避免磁盘读写,排序多的时候可以设置大一点, 一般4M
DBCP连接池的一些配置
- initialSize 启动时创建的初始化连接数量
- maxActive 连接池中可同时连接数据库的线程数。 默认8,一般20
- maxIdle 最大空闲, 超过的会被回收。默认8,太小,可能造成回收创建太频繁
- minIdle 最小空闲,少于会创建,默认0,可以稍微多一点,比如8
- maxWait 没有可用连接时的阻塞时间,默认无现长,有可能无限挂起, 超时会抛异常。我们是30000
- testOnBorrow=false 取得连接时是否验证,时间太长了有可能时效了如果不验证会为空
- testWhileIdle=true 空闲时是否验证,这个要配合验证的sql.
- timeBetweenEvictionRunsMillis=300000 多久启动过期清理线程
- numTestsPerEvictionRun=10 每次清理几个
- minEvictableIdleTimeMillis=300000 多久算是过期的