热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ssdmysqlquerycache_mysql查询缓存query_cache

mysql开启查询缓存在[mysqld]段中配置query_cache_type:[mysqld]query_cache_type20:不开启1

mysql开启查询缓存

在[mysqld]段中配置query_cache_type:

[mysqld]

query_cache_type = 2

0:不开启

1:开启,默认缓存所有,需要在SQL语句中增加select sql-no-cache提示来放弃缓存

2:开启,默认都不缓存,需要在SQL语句中增加select sql-cache来主动缓存(常用)

更改配置后需要重启以使配置生效,重启后可通过show variables来查看,显示DEMAND就是已开启

show variables like 'query_cache_type';

query_cache_type DEMAND

在客户端设置缓存大小

通过配置项query_cache_size来设置:

mysql5.7默认query_cache_size为 1048576 字节 也就是1M

show variables like 'query_cache_size';

query_cache_size 1048576

将查询缓存的大小设置为 64M

set global query_cache_size=64*1024*1024;

show variables like 'query_cache_size';

query_cache_size 67108864

也可以修改配置文件,重启自动生效

[mysqld]

query_cache_type = 2

query_cache_size = 67108864

查询缓存使用示例,将查询结果缓存

select sql_cache * from user;

整理缓存和重置缓存

可以使用下列语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。

FLUSH QUERY CACHE;

从查询缓存中移出所有查询。FLUSH TABLES语句也执行同样的工作。

reset query cache;

FLUSH TABLES;

注意事项

应用程序,不应该关心query cache的使用情况。可以尝试使用,但不能由query cache决定业务逻辑,因为query cache由DBA来管理。

缓存是以SQL语句为key存储的,因此即使SQL语句功能相同,但如果多了一个空格或者大小写有差异都会导致匹配不到缓存。

查询缓存配置参数总结

show variables like 'query_cache%';

query_cache_limit

(单位:byte):查询缓存中可存放的单条查询最大结果集,默认为 1 MB;超过该大小的结果集不被缓存。

query_cache_min_res_unit

4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小 query_cache_min_res_unit。

query_cache_size

设置缓存大小,单位字节。缺省1M

query_cache_type

查询缓存开启情况。缺省 OFF 不开启;

query_cache_wlock_invalidate

如果某个数据表被其他的连接锁住,是否仍然从查询缓存中返回结果。缺省OFF

查询缓存性能监控参数

show status like '%Qcache%';

Qcache_free_blocks

缓存中相邻内存块的个数。数目大说明可能有碎片。

Qcache_free_memory

缓存中的空闲内存

Qcache_hits

每次查询在缓存中命中时就增大。

Qcache_inserts

将查询和结果集写入到查询缓存中的次数。

Qcache_lowmem_prunes

缓存出现内存不足并且必须要进行清理以便为更多查询提供空 间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就 表示可能碎片非常严重,或者内存很少。(上面的 free_blocks 和 free_memory 可以告诉您属于哪种情况)。

Qcache_not_cached

不可以缓存的查询次数。

Qcache_queries_in_cache

查询缓存中缓存的查询量。

Qcache_total_blocks

缓存中块的数量。

查询缓存在这些情况下不会生效

1、查询必须严格一致(大小写、空格、使用的数据库、协议版本、字符集等必须一致)才可以命中,否则视为不同查询。

2、不缓存查询中的子查询结果集,仅缓存查询最终结果集。

3、不缓存存储函数(Stored Function)、存储过程(Stored Procedure)、触发器(Trigger)、事件(Event)中的查询。

4、不缓存含有每次执行结果变化的函数的查询,比如now()、curdate()、last_insert_id()、rand()等。

5、不缓存对mysql、information_schema、performance_schema系统数据库表的查询。

6、不缓存使用临时表的查询。

7、不缓存产生告警(Warnings)的查询。

8、不缓存Select … lock in share mode、Select … for update、 Select * from … where autoincrement_col is NULL类型的查询。

9、不缓存使用用户定义变量的查询。

10、不缓存使用Hint - SQL_NO_CACHE的查询。

11、分区表不能使用查询缓存

数据变更导致的缓存失效问题

当数据表改动时,基于该数据表的任何缓存都会被删除。(表层面的管理,不是记录层面的管理,因此失效率较高);

这里数据表更改包括: INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, or DROP DATABASE等。

举个例子,如果数据表posts访问频繁,那么意味着它的很多数据会被QC缓存起来,但是每一次posts数据表的更新,无论更新是不是影响到了cache的数据,都会将全部和posts表相关的cache清除。如果你的数据表更新频繁的话,那么Query Cache将会成为系统的负担。有实验表明,糟糕时,QC会降低系统13%[1]的处理能力。

功能和适用范围

1、功能:

降低CPU使用率。

降低IOPS使用率(某些情况下)。

减少查询响应时间,提高系统的吞吐量。

适用范围:

2、表数据修改不频繁、数据较静态。

查询(Select)重复度高。

查询结果集小于 1 MB。

说明 查询缓存并不一定带来性能上的提升,在某些情况下(比如查询数量大,但重复的查询很少)开启查询缓存会带来性能的下降。

官方在特定环境测试结果(官方文档中有详细说明):

1、如果对某表进行简单查询,但每次查询条件都不一样时,打开查询缓存会导致性能下降13%。

2、如对一个只有一行数据的表进行查询,则可以提升238%。

所以查询缓存特别适用于更新频率非常低、查询频率非常高的场景。

query_cache在mysql8.0时被移除



推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
励志要成为明星的张佳楠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有