MySQL数据库中怎么查询缓存

67次阅读
没有评论

共计 3757 个字符,预计需要花费 10 分钟才能阅读完成。

这期内容当中丸趣 TV 小编将会给大家带来有关 MySQL 数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、缓存条件,原理

MySQL Query Cache 是用来缓存我们所执行的 SELECT 语句以及该语句的结果集,MySql 在实现 Query  Cache 的具体技术细节上类似典型的 KV 存储,就是将 SELECT 语句和该查询语句的结果集做了一个 HASH 映射并保存在一定的内存区域中。当客户端发起 SQL 查询时,Query  Cache 的查找逻辑是,先对 SQL 进行相应的权限验证,接着就通过 Query  Cache 来查找结果(注意必须是完全相同,即使多一个空格或者大小写不同都认为不同,即使完全相同的 SQL,如果使用不同的字符集、不同的协议等也会被认为是不同的查询而分别进行缓存)。它不需要经过 Optimizer 模块进行执行计划的分析优化,更不需要发生同任何存储引擎的交互,减少了大量的磁盘 IO 和 CPU 运   算,所以有时候效率非常高。

查询缓存的工作流程如下:

1:命中条件

缓存存在一个 hash 表中, 通过查询 SQL, 查询数据库, 客户端协议等作为 key. 在判断是否命中前,MySQL 不会解析 SQL, 而是直接使用 SQL 去查询缓存,SQL 任何字符上的不同, 如空格, 注释, 都会导致缓存不命中.

如果查询中有不确定数据, 例如 CURRENT_DATE()和 NOW()函数, 那么查询完毕后则不会被缓存. 所以, 包含不确定数据的查询是肯定不会找到可用缓存的

2:工作流程

服务器接收 SQL, 以 SQL 和一些其他条件为 key 查找缓存表(额外性能消耗)

如果找到了缓存, 则直接返回缓存(性能提升)

如果没有找到缓存, 则执行 SQL 查询, 包括原来的 SQL 解析, 优化等.

执行完 SQL 查询结果以后, 将 SQL 查询结果存入缓存表(额外性能消耗)

二、相关 SQL 语句

2.1、查看 SQL 缓存参数:show variables like %query_cache%

其中各个参数的意义如下:

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

2.2、开启 SQL 缓存:set global query_cache_type = 1;

2.3、关闭 SQL 缓存:set global query_cache_type = 0;

2.4、设置缓存空间:set global query_cache_size = 1024*1024*64 (64M)

2.5、固定 SQL 语句声明不适用缓存:select sql_no_cache * from 表名

注意:改变 SQL 语句的大小写或者数据表有数据改动,则不会调用缓存。

2.6、配置查询缓存

vi /etc/my.cnf query_cache_size=300M query_cache_type=1

三、清除缓存

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 了。这个也很有用的。

一般来讲,Flush 操作都会记录在二进制日志文件中,但是 FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES  WITH READ  LOCK 不会记录,因此上述操作如果记录在二进制日志文件中话,会对从数据库造成影响。注意:Reset 操作其实扮演的是一个 Flush 操作的增强版的角色。

四、缓存的内存管理

缓存会在内存中开辟一块内存 (query_cache_size) 来维护缓存数据, 其中有大概 40K 的空间是用来维护缓存的元数据的, 例如空间内存, 数据表和查询结果的映射,SQL 和查询结果的映射等.

MySQL 将这个大内存块分为小的内存块(query_cache_min_res_unit), 每个小块中存储自身的类型, 大小和查询结果数据, 还有指向前后内存块的指针.

MySQL 需要设置单个小存储块的大小, 在 SQL 查询开始 (还未得到结果) 时就去申请一块空间, 所以即使你的缓存数据没有达到这个大小, 也需要用这   个大小的数据块去存(这点跟 Linux 文件系统的 Block 一样). 如果结果超出这个内存块的大小, 则需要再去申请一个内存块. 当查询完成发现申请的内存   块有富余, 则会将富余的空间释放掉, 这就会造成内存碎片问题, 见下图

查询缓存存储查询结果后剩余的查询碎片

此处查询 1 和查询 2 之间的空白部分就是内存碎片, 这部分空闲内存是有查询 1 查询完以后释放的, 假设这个空间大小小于 MySQL 设定的内存块大小, 则无法再被使用, 造成碎片问题

在查询开始时申请分配内存 Block 需要锁住整个空闲内存区, 所以分配内存块是非常消耗资源的. 注意这里所说的分配内存是在 MySQL 初始化时就开辟的那块内存上分配的.

五、缓存的使用时机 性能

衡量打开缓存是否对系统有性能提升是一个很难的话题

1. 通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)

2. 通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)

3. 通过命中 - 写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts),   高性能 MySQL 中称之为比较能反映性能提升的指数, 一般来说达到 3:1 则算是查询缓存有效, 而最好能够达到 10:1

任何事情过犹不及,尤其对于某些写频繁的系统,开启 Query Cache 功能可能并不能让系统性能有提升,有时反而会有下降。原因是 MySql 为了保证 Query  Cache 缓存的内容和实际数据绝对一致,当某个数据表发生了更新、删除及插入操作,MySql 都会强制使所有引用到该表的查询 SQL 的 Query  Cache 失效。对于密集写操作,启用查询缓存后很可能造成频繁的缓存失效,间接引发内存激增及 CPU 飙升,对已经非常忙碌的数据库系统这是一种极大的负担。

六、查询缓存问题分析

上述就是丸趣 TV 小编为大家分享的 MySQL 数据库中怎么查询缓存了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3757字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)