下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

MySQL | 查询缓存和清除命令讲解

作者:课课家教育     来源: http://www.kokojia.com点击数:5138发布时间: 2019-03-20 14:58:13

标签: MySQL数据库缓存功能清除命令

  数据库管理中,MySQL查询缓存功能使用性很高,它能缩短查询时间,提高我们的工作效率。MySQL查询缓存不是缓存执行计划,是查询及其结果集。当我们对同一条sql进行了缓存,服务器直接从上次的查询结果缓存中读取数据。非常适合应用于一些不常改变数据且有大量相同sql查询的表。在这篇文章中我将会讲解下MySQL查询缓存和清除命令的使用技巧,大家可以参考下。

  Mysql查询缓存

   1.配置查询缓存

  首先我们要修改配置文件,修改[mysqld]下的query_cache_size和query_cache_type(如果没有则添加)。需要说明的是“query_cache_size”表示缓存的大小,而“query_cache_type”表示缓存哪种类型的select结果集,它有3个值,各个值可以了解下:

  ①0或off关闭缓存

    ②1或on开启缓存,但是不保存使用sql_no_cache的select语句,如不缓存selectsql_no_cachenamefromweiwhereid=2

      ③2或demand开启有条件缓存,只缓存带sql_cache的select语句,缓存selectsql_cachenamefromweiwhereid=4

    如图所示,配置完成后重启Mysql服务器即可。

MySQL配置查询缓存

  接下来我们可以用如下命令查看是否开启,其中query_cache_size和query_cache_type就是上面所说我们的配置;have_query_cache表示是否开启,query_cache_limit则指定单个查询能够使用的缓冲区大小,缺省为1M;而query_cache_min_res_unit是系统分配的最小缓存块大小,默认是4KB,设置值大对大数据查询是有好处的,但如果你的查询都是小数据查询,就会容易出现内存碎片和浪费的情况;query_cache_wlock_invalidate表示当有其他客户端正在对MyISAM表进行写操作时,如果查询在querycache中,是否返回cache结果还是等写操作完成再读表获取结果。

MySQL查看是否开启

  2.测试

  首先我们先执行一次,执行语句“select count(*) from wei;”然后再执行一次,从下图可以看出第二次用的时间是远远低于第一次的执行,这是因为第二次从缓存中读取了select结果。

MySQL测试

      我们也可以通过如下命令查看现在缓存的情况 ,执行语句为“show status like ‘qcache%’;”

MySQL执行“show status like 'qcache%'”语句   

     可以详细了解下各个值的含义:

     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:缓存中块的数量。

      清除缓存

     当我们执行缓存命令之后,其实我们的服务器是会记录下来,在下次我们直接查询的时候就能简短查询时间,但是面对大量数据管理和数据的改动,我们不可能是一直保持原来的缓存需求,在这个时候我们就需要先清除缓存,以方便我们再重新执行新的缓存命令。这时我们就可以执行“reset query cache;”语句,清空缓存。

      在这里要补充下MySQL的FLUSH句法(清除缓存) 

MySQL的FLUSH句法(清除缓存)

  假如我们是要清除一些MySQL使用内部缓存,这时就要使用FLUSH命令。为了执行FLUSH,我们必须有reload权限。

  在上图中的“flush_option”,它可以是下列任何东西:

  HOSTS:使用频率非常高。它主要是用来清空主机缓存表。当我们的某些主机改变IP数字,或者是得到错误消息Host...isblocked,这时我们就应该清空主机表。还有一种情况是在连接MySQL服务器时,对一台给定的主机有多于max_connect_errors个错误连续不断地发生,MySQL为了安全的需要将会阻止该主机进一步的连接请求。那这个时候我们就要清空主机表允许主机再尝试连接。

  LOGS:关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。

  PRIVILEGES:也是经常使用的,每当重新赋权后,为了以防万一,让新权限立即生效,一般都执行一把,目的是从数据库授权表中重新装载权限到缓存中。

  TABLES:关闭所有打开的表,同时此操作将会清空查询缓存中的内容。

  FLUSHTABLESWITHREADLOCK:关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlocktables,该操作常常用于数据备份的时候。

  STATUS:重置大多数状态变量到0。

  MASTER:删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件。要说明的是这个已经不推荐使用,改成resetmaster了。

  QUERYCACHE:重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table和Reset Query Cache(将会清空查询缓存的内容)不一样。

  SLAVE:类似于重置复制,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relaylog,同Master一样,这个已经不推荐使用,改成ResetSlave了。

  总的来说,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLE SWITH READ LOCK不会记录,所以上述操作如果记录在二进制日志文件中话,会对数据库造成影响。特别注意:Reset操作其实扮演的是一个Flush操作的增强版的角色。

      在这篇文章上我们可以详细了解下MySQL数据库查询缓存和清除命令操作,它们在实际应用上使用性特别强。查询缓存在实际操作中特别容易上手,但要理解好的它的执行行为。同时本文中的MySQL的FLUSH句法也是学习的难点。大家在这方面多用点心。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程