1,query_cache_size
query_cache_size:query cache 是用来缓存SQL语句文本和对应查询结果的缓存空间,如果相应的表没有变化,那么下次在碰到完全一致的SQL的时候,则跳过一切解析和查询,直接返回结果,这对某些情况是适合的,但是如果表变化非常频繁,SQL也是动态生成的,则由于要不断更新CACHE中的内容,并且这个时候锁粒度是非常大,反而会成为瓶颈,所以很多情况下,会关掉这个选项,设置此参数为0.
具体配置方法:
1.将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M。
2.增加一行:query_cache_type=1
如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。但是这种情况下query_cache_size设置的大小系统是否要为其分配呢,这个问题有待于测试?
如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。
如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。
OK,配置完后的部分文件如下:
query_cache_size=128M
query_cache_type=1 show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
6 rows in set (0.00 sec)
set global query_cache_type=1;
ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it
查了下报错原因:
query_cache_type参数需要动态编译开启,如果用户在运行时动态关闭query cache, 会导致额外CPU的开销,即对query cache加解锁操作。在负载非常高的MySQL服务器上,这个问题变得尤为突出。
我们可以通过show status like ‘%Qcache%';语句来测试,现在我们开启了查询缓存功能,在执行查询前,我们先看看相关参数的值:
show status like '%Qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1031832 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 54 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+---------+
8 rows in set (0.00 sec)
这里顺便解释下这个几个参数的作用:
Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。
Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。
Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。
Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。
Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量。
Qcache_queries_in_cache:当前缓存中缓存的查询数量。
Qcache_total_blocks:当前缓存的block数量。
2,sort_buffer_size
sort_buffer_size:mysql在排序的时候,如果用不到索引就会在内部临时进行排序,这时候会在内部临时进行排序,这时候会用到排序的buffer,如果这个参数值过小的话,排序过程中会把结果写到物理磁盘,严重影响效率,,但是这是一个session级别变量,也就是说每个session用到它的时候,都会申请这么大的内存,所以如果太大的话,又很可能耗尽物理内存,导致服务器OOM,在设置它的大小时,一定要根据自己的情况,灵活设置,类似的另一个参数join_buffer_size,是在join无法用到锁的时候用到的buffer,也需要灵活设置。
3,tmp_table_size
tmp_tabl_size:在group by或distinct的时候,如果SQL语句用不到索引,就会使用系统内部临时表记录中间状态。如果tmp_table_size不够大,则mysql会自动使用武力磁盘,这回对查询性能造成很大的影响,增加此参数可以降低这种情况发生的概率。
4,innodb_buffer_pool_size
innodb_buffer_pool_size:innodb最重要的缓存,用来缓存innodb索引界面,undo页面及其他一些辅助数据吗,它的大小是影响性能的重要因素,基本上各种文档都会要求在内存允许的情况下尽可能地配置大一些,官方则建议配置为物理内存的50%~75%。
5,innodb_buffer_pool_instances
innodb_buffer_pool_instances:通过这个参数把原来一整块buffer pool分割为多块内存空间,每个空间独立管理自己的空闲链表,刷新链表,lru及其他数据结构,这大大增加了并发性,能更有效的利用缓存。
6,innodb_log_file_size,innodb_log_files_in_group
innodb_log_file_size,innodb_log_files_in_group:这两个参数结合,决定了REDO空间的大小,redo空间 约旦,可以存储的增量更新日志越大,有效降低buffer pool赃页面被淘汰的速度,同时减少了checkpoint的次数,降低磁盘IO置换率,从而提升数据库的写入效率,不过也有可能会导致数据库异常退出时,恢复时间被拉长。
7,innodb_old_blocks_pct,innodb_old_blocks_time
innodb_old_blocks_pct,innodb_old_blocks_time:这两个参数控制buffer pool中缓存数据的过期和移动行为,二者结合设置,可以优化一些全表扫描带来的大规模更闹心buffer等问题。
8,innodb_numa_interleave
innodb_numa_interleave:mysql服务器很多时候会出现内存被交换到SWAP分区的情况,这时性能就会急剧下降,但是我们去查看服务情况的时候,往往会发现实际上操作系统还有很多空闲内存,在mysql5.7.9之后,通过这个参数可以避免这个问题。在mysql5.7.9之后通过这个参数可以避免这个问题。mysql在分配内存的时候,会把NUMA的策略设置为MPOL_INTERLEVEL,当然,这需要在支持NUMA的系统上编译mysql才行。
9,innodb_autoinc_lock_mode
innodb_autoinc_lock_mode:在innodb有自增列的情况下,在插入数据的时候,会自动产生自增值,这个参数是控制自增值生成的方式,目前有三个选项0,1,2.其实这个枚举,真正的含义是:traditional,consecutive和interleaved,使用2即interleaved,这样在INSERT数据的时候,不会用到表级的AUTO-INC锁,避免AUTO-INC的死锁问题,在INSERT...SELECT的场景下及大地提升性能,在做普通INSERT的时候,也会提升并发执行的效率。
10,innodb_flush_method
innodb_flush_method:innodb刷数据和日志到磁盘文件的方式默认为NULL,但其实如果是在类UNIX系统上,默认为fsync,在Windows系统上默认为async_unbuffered.这里要说的是,它还有个可能的值是O_DIRECT,在使用SSD或PCIE类型的存储时,可以设置为O_DIRECT,底层调用directio(),直接修改写入磁盘,以提升性能。
11,innodb_doublewrite
innodb_doublewrite:如果底层存储时支持原子写的,则可以关闭两次写,以提升效率。
12,innodb_io_capacity
innodb_io_capacity:innodb有后台线程在不断做FLUSH操作影响这个操作评率的就是innodb_io_capacity参数,如果碰到系统因为后台FLUSH操作而产生周期性性能降低的情况,特别是使用SSD设备的时候,可以适当提高这个参数的值,以加速FLUSH的频率。
13,innodb_thread_concurrency
innodb_thread_concurrency:在并发量大的实例上,增加这个值,可以降低innodb在并发线程之间切换的花销,以增加系统的并发吞吐量。