服务器级别参数:
Query Cache
参数名:
query_cache_type=ON #打开查询缓存,不建议打开
query_cache_limit=1M #缓存的最大结果集为1M
query_cache_min_res_unit=1K #缓存的最小结果集为1K
query_cache_size=0 #查询缓存大小,以字节为单位,须为1024的整数倍,建议为系统内存的1/8,不超过256M
状态变量:
Qcache_free_blocks:目前还处于空闲状态的Query Cache中内存Block数目
Qcache_free_memory:目前还处于空闲状态的Query Cache内存总量
Qcache_hits:Query Cache 命中次数
Qcache_inserts:向Query Cache中插入新的Query Cache的次数,也就是没有命中的次数
Qcache_lowmem_prunes:当Query Cache内存容量不够,需要从中删除老的Query Cache以给新的Cache对象使用的次数
Qcache_not_cached:没有被Cache的SQL数
Qcache_queries_in_cache:目前在Query Cache中的SQL数量
Qcache_total_blocks:Query Cache中总的Block数量
评估方式:
命中率: (Qcache_hits/(Qcache_hits+Qcache_inserts))*100%
如果命中率高,且Qcache_free_memory大则说明query_cache_size设置过大
如果命中率低,且Qcache_lowmem_prunes大则说明query_cache_size设置过小
Thread Cache
参数名:
thread_cache_size #线程缓存池大小
状态变量:
Threads_cached:线程缓存中的线程数。
Threads_connected:当前打开的连接数。
Threads_created:创建用来处理连接的线程数(没有使用线程缓存中的线程时,该状态会增加)。
Connections:试图连接到(不管是否成功)MySQL服务器的连接数
评估方式:
1.当Threads_created过大时可以考虑增大thread_cache_size的值。
2.Thread cache命中率:thread_cache_hit=(connections-threads_created)/connections * 100%,thread cache命中率应该保持在90%左右甚至更高的比率才正常
Thread管理:
参数名:
thread_stack #单个线程堆栈大小,会影响线程可处理的SQL语句的复杂程度、存储过程的递归深度及其他消耗内存的行为
join_buffer_size #为普通索引扫描(index)、范围索引扫描(range)、全表扫描(all)或index merge的JOIN分配的缓冲池大小
#实际上参与join的每个表都会用到join buffer,所以一条SQL至少会用到两个join buffer
sort_buffer_size #当SQL需要进行排序操作时会用到,通过增大sort buffer的大小可以提高order by或group by的处理性能。全引擎通用,无法被查询优化器和索引优化的查询会使用该缓冲区。
read_buffer_size #为顺序扫描(顺序读)线程分配的缓冲池大小。必须为4KB的倍数。如果设置不为4KB的倍数时会向下取整。通常顺序读多的场景需要加大该值。最大2GB。
#还有如下场景会用到该值:1.使用ORDER BY做排序时,需要在临时文件(不是临时表)中缓存索引 2.大块INSERT插入分区 3.嵌套查询缓存结果集
read_rnd_buffer_size #为随机扫描(随机读)线程分配的缓冲池大小。MRR技术会使用到该值,查询中有大量使用ORDER BY子句做排序操作的,可以增大该值。最大2GB。
binlog_cache_size #binlog缓存大小
状态变量:
Sort_merge_passes #当需要排序时,在排序缓冲中无法将结果完全存放,则将会基于磁盘创建临时文件进行排序。
Select_full_join #
Select_range_check #
评估方式:
1.Select_full_join与Select_range_check中任何一个不为0,都需要检查SQL是否存在问题,使用explian查看SQL的时候,会看到Extra列显示with join buffer.这个时候,MYSQL会为对应线程分配join_buffe_size大小的内存,它是真正的性能杀手,需要严肃对待。
2.如果Sort_merge_passes值较高,则应提高sort_buffer_size大小。最好的办法是找到是由哪些排序SQL造成的。
3.通过binlog_cache_use和binlog_cache_disk_use来判断当前binlog_cache_size是否合适
文件描述符
参数名:
open_files_limit #最大打开文件数(mysqld文件描述符限制)。最大值为系统允许最大值,linux使用ulimit -n命令查看。
table_open_cache #为了解决打开表描述文件符太过频繁的问题,mysql在系统中实现了一个table cache机制,用来cache打开的所有表文件的描述符。
#通过这样的方式来减少因为频繁打开关闭文件描述符所带来的资源消耗。该参数的设置与max_connection成正比,比值取决于一个connection打开多少表
状态变量:
open_tables #正在被使用的表文件描述符
opened_tables #已经打开过的所有表文件描述符
评估方式:
open_tables/opened_tables>=0.85
open_tables/table_open_cache<=0.95
table_open_cache<open_file_limit< ulimit –u
使用flush table来关闭所有文件描述符,通过查看table open状态来查看参数设置是否合理,合理的设置应该如下:
cat /etc/security/limits.conf 查看系统对系统用户的资源限制
cat /proc/<proc_id>/limits 查看系统对某个进程( proc_id进程ID)的资源限制
基准设置:
max_connections = 3000 #mysql允许的会话数上限
back_log=200 #back_log的值表示:MySQL(处理大量请求时,由于满负荷)暂时停止回复新请求前能够堆放的请求数。如果用户短时间内有更大的连接数,应该增大back_log的值
max_allowed_packet = 32M #限制server接受的数据包大小
wait_timeout = 1800 # 关闭空闲连接时等待的秒数。
interactive_timeout = 1800 #关闭一个交互连接时等待的秒数。
explicit_defaults_for_timestamp=1 #mysql会按照特定的方式处理TIMESTAMP 列
sql_mode = PIPES_AS_CONCAT,ANSI_QUOTES,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION #指定SQL语法限制
innodb_autoinc_lock_mode=1 #自增长键的生成模式
thread_handling = one-thread-per-connection #线程处理模式
thread_pool_size = 16 #线程池中线程组的大小
thread_pool_stall_limit = 500 #该值的作用是防止线程池中的线程出现假死,设定值为timer线程检测间隔时长。若超过该值线程无响应,则线程池会创建新的线程。单位毫秒
thread_pool_max_threads = 500 # 线程池中最大线程数量
thread_pool_idle_timeout = 60 # 空闲的线程退出时间间隔。默认值60s。
thread_pool_oversubscribe = 8 # 控制每个Group里同时可以运行多少个任务
tmp_table_size = 128M #临时表大小设置
max_heap_table_size = 128M
sync_binlog=1 #二进制日志的刷盘频率
tx_isolation=REPEATABLE-READ #事务的隔离级别
innodb存储引擎
Buffer Pool
参数:
innodb_buffer_pool_instances = 1 # 建议根据CPU核数的2倍来调整 注:设置该参数时innodb_buffer_pool_size必须要大于1G。
innodb_buffer_pool_size = 1G #用来缓存innodb索引和数据,系统物理内存的50%-80%之间
状态变量:
innodb_buffer_pool_pages_data #innodb中已经被使用的内存大小
innodb_buffer_pool_pages_total #innodb总数据块数
innodb_buffer_pool_read_requests #总请求次数
innodb_buffer_pool_reads #直接读取磁盘的请求次数
评估方式:
通过以下两个比率来查看innodb_buffer_pool_size的值是否设置过大:
使用率:(innodb_buffer_pool_pages_data/innodb_buffer_pool_pages_total* innodb_page_size)*100% >90%
命中率:(innodb_buffer_pool_read_requests-innodb_buffer_pool_reads)/ innodb_buffer_pool_read_requests * 100% >90%
Buffer Pool管理:
innodb_use_sys_malloc = 1 #使用系统内存管理
innodb_old_blocks_time = 1 #LRU old blocks进入热点区的时间
innodb_old_blocks_pct=37 #LRU中old blocks的比例
innodb_doublewrite #禁用 skip_innodb_doublewrite
innodb_adptive_hash_index=ON #自适应hash索引开关
innodb_flush_neighbors = 1 #刷新邻近页开关
innodb_use_native_aio = 1 #异步IO开关
innodb_thread_concurrency = 120 #可进入innodb的并发线程数,限制innodb对cpu的使用。可设置为cpu的四倍,默认为0,表示不限制
innodb_adaptive_max_sleep_delay=600 #600微秒
innodb_concurrency_tickets=500 #500次通行证
innodb_file_format = Barracuda #文件格式
innodb_page_size = 16k #页大小
innodb_io_capacity = 4000 #磁盘吞吐量
innodb_io_capacity_max = 8000
innodb_purge_batch_size = 300 #每次purge undo页的数量
innodb_purge_threads = 4 #purge undo页的线程数
innodb_max_purge_lag=0 #控制待回收undo页的history list的长度,默认为0,不做限制
innodb_lru_scan_depth = 1024 #LRU列表中空闲页的数量
innodb_max_dirty_pages_pct = 80 #最大脏页占比
innodb_adaptive_flushing = 1 #自适应刷新开关
innodb_read_io_threads = 20 #read IO数量
innodb_write_io_threads = 15 #write IO数量
innodb_log_file_size=1G #重做日志大小,影响高低水位线
innodb_log_files_in_group=3
innodb_flush_log_at_trx_commit = 1 #redo log buffer的刷新频率
innodb_flush_method = O_DIRECT #取值有fdatasynco_directo_dsync
#=fdatasync,日志和数据的刷新都使用系统的fsync()函数,先刷缓存再刷磁盘
#=o_dsync,日志使用0_sync的方式直接从磁盘读取和刷新,数据调用系统的fsync()函数,先刷缓存再刷磁盘
#=o_direct,日志使用fsync()的方式,先刷缓存再刷磁盘,数据直接从磁盘读取和刷新,这种方式最能减少缓冲对IO的影响,如果是ssd盘的话可以选用这种方式
innodb_force_recovery = 0 # 用于灾难恢复的选项。默认值为0
innodb_fast_shutdown = 0 #innodb的关闭模式,1为快速关闭
Insert Buffer:
参数:
innodb_change_buffering = all #insert buffer配置
innodb_change_buffer_max_size=25 #change buffer在缓存池中的占比
myisam
参数:
key_buffer_size = 256M #myisam键缓冲区大小
评估:
通过以下三个比率数据,就可以知道key cache设置是否合理:
Key_buffer使用率=(key_blocks_used/(key_blocks_used+key_blocks_unused))*100%
Key_buffer_read_hitratio=(1-key_reads/key_read_requests)*100%
Key_buffer_write_hitratio=(1-key_writes/key_write_requests)*100%
一般来说key_buffer使用率应该在99%以上,key_buffer_read_hitratio也应该尽可能地高
bulk_insert_buffer_size=8M #MYISAM引擎批量插入暂存使用内存。默认为8M。