美文网首页架构社区
MySQL的查询缓存

MySQL的查询缓存

作者: basetree | 来源:发表于2018-06-15 16:39 被阅读105次



MySQL数据库的简单原理

MySQL是一个单进程的服务,对于每一个请求都是用线程来响应的,这就需要一个连接器来处理新用户的请求、响应以及销毁。

1.客户端请求,服务端开启线程响应用户。

2.用户发起SQL语句,查询数据库。

3.查询缓存:记录用户的SQL查询语句,如果查询的内容是相同的,就会返回缓存。

4.如果缓存中没有对应的结果,就进入分析器(检查用户命令语法是否正确,将用户命令进行切片 ,用空格隔开每一个一个词,以此来获得用户要查询的表,内容和权限等等)。

5.优化器:执行路径的选择,生成执行树,每一个SQL语句都有很多执行路径,优化的目的是在这些路径里面选择一个最优的执行路径。

6.存储引擎:用于管理存储在文件系统或是裸设备上的数据管理程序。它本身给上层应用提供不同的管理,有的支持事务,有的不支持事务。

基本处理流程

缓存机制的简单介绍

    缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器则直接从缓存中取到结果,而不需要再去解析和执行sql。如果表更改了,那么使用这个表的所有缓存查询将不再有效,查询缓存值的相关条目也会被清空。更改指的是表中任何数据或是结构的改变,包括insert、update、delete、truncate、alter table、drop table或drop database等,也包括那些映射到改变了的表的使用MERGE表的查询。显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有大量相同sql查询的表,是非常合适的。
    启用MySQL查询缓存可以极大地降低数据库服务器的CPU使用率,换一种说法,就是可以提高其性能。

MySQL检查缓存命中的规则

1、在检查缓存的时候,MySQL 不会对语句进行解析、正则化或者参数化,它精确地使用客户端传来的查询语句和其他数据。只要字符大小写、空格或者注释有一点点不同,查询缓存就认为这是一个不同的查询。

2、查询缓存不会存储有不确定结果的查询。因此,任何一个包含不确定函数(比如NOW()或CURRENT_DATE())的查询不会被缓存。同样地,CURRENT_USER()或CONNECTION_ID()这些由不同用户执行,将会产生不同的结果的查询也不会被缓存。事实上,查询缓存不会缓存引用了用户自定义函数、存储函数、用户自定义变量、临时表、mysql 数据库中的表或者任何一个有列级权限的表的查询。

3、查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。

开启查询缓存的开销

1.读取查询在开始之前必须要检查缓存。

2. 如果查询是可以被缓存的,但是不在缓存中,那么在产生结果之后进行保存会带来一些额外的开销。写入数据的查询也会有额外的开销,因为它必须使缓存中相关的数据表失效。这些开销相对来说较小,所以查询缓存还是很有好处的。但是,稍后你会看到,额外的开销有可能也会增加。从缓存中受益最多的查询可能是需要很多资源来产生结果,但是不需要很多空间来保存的类型。所以用于存储、返回和失效的代价都较小。聚集查询,比如从大表中利用COUNT()产生较小的结果,就符合这个范畴。

MySQL缓存状态的查看

在mysql命令行执行命令(这里有两种,第一种比较详细,推荐):
(1) mysql> show variables like '%cache%';
(2) mysql> show variables like '%query_cache%';

第一种命令的缓存状态

1.have_query_cache:表示支持开启缓存,这个值并不代表查询缓存已经开启了。

2.query_cache_type: 控制 Query Cache 功能的开关,可以设置为OFF,ON和DEMAND三种,OFF为关闭 Query Cache 功能,任何情况下都不会使用 Query Cache,ON:开启 Query Cache 功能,但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache,DEMAND开启 Query Cache 功能,但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache。(我这里为OFF,下面有开启的配置)。

3.binlog_cache_size:默认大小是32768,即32K。

4.max_binlog_cache_size: 默认值是18446744073709547520,这个值很大,够我们使用的了。此参数和binlog_cache_size相对应,代表binlog所能使用的cache最大使用大小。如果系统中事务过多,而此参数值设置有小,则会报错。

5.query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache。

6.query_cache_min_res_unit:设置 Query Cache 中每次分配内存的最小空间大小,也就是每个 Query 的 Cache 最小占用的内存空间大小。

7.query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0(我这里为1677216,即为16M,下面设置为32M),大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数。

8.query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有 Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。

开启查询缓存和设置查询缓存的内存

1.打开mysql的配置文件
sudo vim /etc/mysql/my.cnf

2.在[mysqld]添加 
query_cache_type = 1
query_cache_size = 32M (这里需要大于40KB,不然会报错)

开启缓存和设置缓存内存大小

3.重启mysql服务
sudo service mysql restart

缓存状态

这里已经开启了查询缓存,但是大小没有改变为32M,这里采取另一种方法设置(全局设置),在mysql命令行执行命令 mysql> set global query_cache_size = 32 * 1024 * 1024;

缓存状态

此时query_cache_size已经更改为32M了。

检查查询缓存的使用情况

在mysql命令行执行命令 mysql> show status like '%qcache%';

查询缓存使用情况

1.Qcache_free_blocks:目前还处于空闲状态的 Query Cache中内存 Block数目

2.Qcache_free_memory:目前还处于空闲状态的 Query Cache内存总量。

3.Qcache_hits:表示有多少次命中缓存。主要可以通过该值来验证我们的查询缓存的效果,数字越大,缓存效果越理想。(我这里为新的测试机,没有对数据库进行任何读写操作,所以为0)。

4.Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。

5.Qcache_lowmem_prunes:当 Query Cache内存容量不够,需要从中删除老的Query Cache以给新的 Cache 对象使用的次数。

6.Qcache_not_cached:没有被 Cache的SQL数,包括无法被 Cache的 SQL 以及由于query_cache_type设置的不会被Cache的 SQL。(这里我进行一些SQL操作,所以会有数据)。

7.Qcache_queries_in_cache:目前在 Query Cache中的SQL数量。

8.Qcache_total_blocks:Query Cache中总的Block数量。

清空缓存

在mysql命令行中执行命令  mysql> flush status;

清空缓存

    根据不同的业务需求来选择是否开启查询缓存以及相对应的设置。

相关文章

  • MySQL学习——查询缓存

    MySQL查询缓存简介 MySQL查询缓存是MySQL将查询返回的完整结果保存在缓存中。当查询命中该缓存,MySQ...

  • (8)MySQL性能优化的最佳21条经验(未完待续)

    1.为查询缓存优化你的查询 某些查询语句会让MySQL不使用缓存。 MySQL的查询缓存对这个函数不起作用。像...

  • MySQL数据库性能优化

    MySQL架构 查询缓存 查询缓存(Query Cache)原理: 缓存SELECT操作或预处理查询的结果集和SQ...

  • 查询缓存

    查询缓存原理 mysql查询缓存保存完整的查询结果,当查询命中缓存时,立刻返回结果,跳过了解析,优化和执行阶段。 ...

  • Mysql查询优化

    查询缓存 1.可以使用如下的语句来判断MySQL是否开启了查询缓存功能: 2.如果想查看MySQL是否是读取的缓存...

  • mysql查询缓存

    MySQL 的查询缓存是MySQL 内置的一种缓存机制,可以针对 sql 进行缓存。 1.query_caceh_...

  • MySQL查询缓存

    简介: mysql通过查询缓存优化来优化查询效率,当执行相同的一条sql时,mysql会将数据缓存起来以供下...

  • Mysql 查询优化

    如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。缓存在第一次查询后,MySQL便将查询语句以及...

  • MySQL数据库十大优化技巧

    1. 优化你的MySQL查询缓存 在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理...

  • MySQL多表查询及子查询

    1. MySQL数据库执行查询操作时的查询流程: 请求-->查询缓存请求-->查询缓存-->解析器-->预处理器-...

网友评论

    本文标题:MySQL的查询缓存

    本文链接:https://www.haomeiwen.com/subject/mxqmeftx.html