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

mysql view 传参数 mysql的参数_缓存

如果设置为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在并发线程之间切换的花销,以增加系统的并发吞吐量。