默认配置下,MySQL的该功能是没有启动的,可能你经过show variables like '%query_cache%';会发现其变量have_query_cache的值是yes,MYSQL初学者很容易觉得这个参数为YES就表明开启了查询缓存,其实是不对的,该参数表示当前版本的MYSQL是否支持Query Cache,其实是否开启查询缓存是看另一个参数的值:query_cache_size ,该值为0,表示禁用query cache,而默认配置正是配置为0。 mysql
配置方法: sql
在MYSQL的配置文件my.ini或my.cnf中找到以下内容: 缓存
# Query cache is used to cache SELECT results and later return them ide
# without actual executing the same query once again. Having the query 性能
# cache enabled may result in significant speed improvements, if your 测试
# have a lot of identical queries and rarely changing tables. See the 优化
# "Qcache_lowmem_prunes" status variable to check if the current value orm
# is high enough for your load. 内存
# Note: In case your tables change very often or if your queries are it
# textually different every time, the query cache may result in a
# slowdown instead of a performance improvement.
query_cache_size=0
以上信息是默认配置,其注释意思是说,MYSQL的查询缓存用于缓存select查询结果,并在下次接收到一样的查询请求时,再也不执行实际查询处理而直接返回结果,有这样的查询缓存能提升查询的速度,使查询性能获得优化,前提条件是你有大量的相同或类似的查询,而不多改变表里的数据,不然没有必要使用此功能。能够经过Qcache_lowmem_prunes变量的值来检查是否当前的值知足你目前系统的负载。注意:若是你查询的表更新比较频繁,并且不多有相同的查询,最好不要使用查询缓存。
具体配置方法:
1. 将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际状况,但最好设置为1024的倍数,参考值32M。
2. 增长一行:query_cache_type=1
query_cache_type参数用于控制缓存的类型,注意这个值不能随便设置,必须设置为数字,可选项目以及说明以下:
若是设置为0,那么能够说,你的缓存根本就没有用,至关于禁用了。可是这种状况下query_cache_size设置的大小系统是否要为其分配呢,这个问题有待于测试?
若是设置为1,将会缓存全部的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。
若是设置为2,则只缓存在select语句中经过SQL_CACHE指定须要缓存的查询。
OK,配置完后的部分文件以下:
query_cache_size=128M
query_cache_type=1
保存文件,从新启动MYSQL服务,而后经过以下查询来验证是否真正开启了:
mysql> 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 | 134217728 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+-----------+
6 rows in set (0.00 sec)
主要看query_cache_size和query_cache_type的值是否跟咱们设的一致:
这里query_cache_size的值是134217728,咱们设置的是128M,实际是同样的,只是单位不一样,能够本身换算下:134217728 = 128*1024*1024。
query_cache_type设置为1,显示为ON,这个前面已经说过了。
总之,看到上边的显示表示设置正确,可是在实际的查询中是否可以缓存查询,还须要手动测试下,咱们能够经过show status like '%Qcache%';语句来测试,如今咱们开启了查询缓存功能,在执行查询前,咱们先看看相关参数的值:
mysql> show status like '%Qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 134208800 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 2 |
| 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数量。
下边咱们测试下:
好比执行以下查询语句
mysql> select * from user where id = 2;
+----+-------+
| id | name |
+----+-------+
| 2 | test2 |
+----+-------+
1 row in set (0.02 sec)
而后执行show status like '%Qcache%',看看有什么变化:
mysql> show status like '%Qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 134207264 |
| Qcache_hits | 0 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 3 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+-----------+
8 rows in set (0.00 sec)
对比前面的参数值,咱们发现Qcache_inserts变化了。Qcache_hits没有变,下边咱们在执行一样的查询
select * from user where id = 2,按照前面的理论分析:Qcache_hits应该等于1,而Qcache_inserts应该值不变(其余参数的值变化暂时不关注,读者能够自行测试),再次执行:
show status like '%Qcache%',看看有什么变化:
mysql> show status like '%Qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 134207264 |
| Qcache_hits | 1 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 4 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+-----------+
8 rows in set (0.00 sec)