MySQL缓存的查询和清除命令使⽤详解
Mysql 查询缓存
查询缓存的作⽤就是当查询接收到⼀个和之前同样的查询,服务器将会从查询缓存种检索结果,⽽不是再次分析和执⾏上次的查询。这样就⼤⼤提⾼了性能,节省时间。
1.配置查询缓存
修改配置⽂件,修改[mysqld]下的query_cache_size和query_cache_type(如果没有则添加)。其中query_cache_size表⽰缓存的⼤⼩,⽽query_cache_type有3个值,表⽰缓存那种类型的select结果集,query_cache_type各个值如下:
0或off关闭缓存
1或on开启缓存,但是不保存使⽤sql_no_cache的select语句,如不缓存select sql_no_cache name from wei where id=2
2或demand开启有条件缓存,只缓存带sql_cache的select语句,缓存select sql_cache name from wei where id=4
例⼦的配置为下,配置完成重启Mysql服务器即可。
query_cache_size=10M
query_cache_type=1
可以⽤如下命令查看是否开启,其中have_query_cache为是否开启,query_cache_limit 指定单个查询能够使⽤的缓冲区⼤⼩,缺省为1M;query_cache_min_res_unit为系统分配的最⼩缓存块⼤⼩,默认是4KB,设置值⼤对⼤数据查询有好处,但如果你的查询都是⼩数据查询,就容易造成内存碎⽚和浪费;query_cache_size和query_cache_type就是上⾯我们的配置;query_cache_wlock_invalidate表⽰当有其他客户端正在对MyISAM表进⾏写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
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 | 10485760 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+----------+
6 rows in set (0.00 sec)
2.测试
我们先执⾏⼀次,select count(*) from wei ;然后再执⾏⼀次,可以看出第⼆次⽤的时间远远低于第⼀次的执⾏,因为第⼆次从缓存中读取了select结果。
mysql> select count(*) from wei ;
+----------+
| count(*) |
+----------+
| 4194304 |
+----------+
1 row in set (3.9
2 sec)
mysql> select count(*) from wei ;
+----------+
| count(*) |
+----------+
| 4194304 |
+----------+
1 row in set (0.00 sec)
我们可以通过如下命令查看现在缓存的情况
mysql> show status like 'qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 10475424 |
| Qcache_hits | 1 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+----------+
8 rows in set (0.00 sec)
其中各个参数的意义如下:
Qcache_free_blocks:缓存中相邻内存块的个数。数⽬⼤说明可能有碎⽚。FLUSH QUERY CACHE会对缓存中的碎⽚进⾏整理,从⽽得到⼀个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增⼤
Qcache_inserts:每次插⼊⼀个查询时就增⼤。命中次数除以插⼊次数就是不中⽐率。
Qcache_lowmem_prunes:缓存出现内存不⾜并且必须要进⾏清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表⽰可能碎⽚⾮常严重,或者内存很少。(上⾯的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进⾏缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者⽤了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。
清除缓存
mysql的FLUSH句法(清除缓存)
FLUSH flush_option [,flush_option]
如果你想要清除⼀些MySQL使⽤内部缓存,你应该使⽤FLUSH命令。为了执⾏FLUSH,你必须有reload权限。
flush_option可以是下列任何东西:
HOSTS 这个⽤的最多,经常碰见。主要是⽤来清空主机缓存表。如果你的某些主机改变IP数字,或如果你得到错误消息Host ... isblocked,你应该清空主机表。当在连接MySQL服务器时,对⼀台给定的主机有多于 max_connect_errors 个错误连续不断地发⽣,MySQL为了安全的需要将会阻⽌该主机进⼀步的连接请求。清空主机表允许主机再尝试连接。
LOGS 关闭当前的⼆进制⽇志⽂件并创建⼀个新⽂件,新的⼆进制⽇志⽂件的名字在当前的⼆进制⽂件的编号上加1。
PRIVILEGES 这个也是经常使⽤的,每当重新赋权后,为了以防万⼀,让新权限⽴即⽣效,⼀般都执⾏⼀把,⽬地是从数据库授权表中重新装载权限到缓存中。
TABLES 关闭所有打开的表,同时该操作将会清空查询缓存中的内容。
FLUSH TABLES WITH READ LOCK 关闭所有打开的表,同时对于所有数据库中的表都加⼀个读锁,直到显⽰地执⾏unlock tables,该操作常常⽤于数据备份的时候。
STATUS 重置⼤多数状态变量到0。
MASTER 删除所有的⼆进制⽇志索引⽂件中的⼆进制⽇志⽂件,重置⼆进制⽇志⽂件的索引⽂件为空,创建⼀个新的⼆进制⽇志⽂件,不过这个已经不推荐使⽤,改成reset master 了。可以想象,以前⾃⼰是多⼟啊,本来⼀条简单的命令就可以搞定的,却要好⼏条命令来,以前的做法是先查出来当前的⼆进制⽇志⽂件名,再⽤purge 操作。
QUERY CACHE 重整查询缓存,消除其中的碎⽚,提⾼性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query Cache(将会清空查询缓存的内容)不⼀样的。
SLAVE 类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master ⼀样,已经不推荐使⽤,改成Reset Slave了。这个也很有⽤的。
之前下过mysql现在重新下载mysql⼀般来讲,Flush操作都会记录在⼆进制⽇志⽂件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,因此上述操作如果记录在⼆进制⽇志⽂件中话,会对从数据库造成影响。注意:Reset操作其实扮演的是⼀个Flush操作的增强版的⾓⾊。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论