`
eyesmore
  • 浏览: 363897 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql query cache

阅读更多


query_cache 读者摘要:

http://blog.csdn.net/qiuyepiaoling/article/details/6004611 

1、query_cache是server的查询缓存,跟存储引擎无关。当然存储引擎层也有查询缓存。
2、query_cache缓存的VALUE是“结果集”,而不是“页”。KEY是SQL语句,取HASH,如果SQL中含有子查询,也是作为整体Cache,而不会按子查询分别Cache。
3、内存与磁盘的读写速度差异是千倍级。直观的说:宁愿在内存中执行1000次,不要在磁盘上执行一次。
4、query_cache提高查询效率的2个原因:(1)内存读写性能比磁盘好;(2)缓存命中时,减少了SQL解析和优化时间。
5、失效机制: 一个表的任何修改,都会促使涉及这个表的所有query cache失效。 这个机制不合理,因为不是所有的表更新都会改变SQL的结果集。但是这个机制实现简单。
6、query_cache的配置和统计:
(1)设置: SHOW VARIABLES LIKE '%query_cache%';
(2)统计:  show status like 'Qcache%' ;
(3)内存管理:query_cache的内存管理也是按块分配,不是按需分配,因此当需要1.8块的时候,要占2块,导致出现内部碎片(mysql的flush query cache是碎片整理工具,碎片整理期间,所有的Cache都会被锁住禁用)。query_cache也是指定总池子大小,如果池子满了,则会进行“驱逐”。

7、即使query_cache开关打开了,也有不执行cache的情况发生:
(1)SQL包含不确定函数,比如current_date 或 rand(随机数)等。
(2)结果集太大,超过了query_cache_limit的大小,默认数值是1M。
(3)query_cache总内存空间不够,新的会被缓存,老的会被驱逐。
(4)在SQL语句上明确用SQL_NO_CACHE指定不缓存。

8、运维关键

SHOW VARIABLES LIKE '%query_cache%';

query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache
“值大小限制”: Value大小限制,结果集默认不能超过1M,超过1M的不给于缓存。跟Memcached类似。

query_cache_min_res_unit:设置 Query Cache 中每次分配内存的最小空间大小,也就是每个 Query 的 Cache 最小占用的内存空间大小,默认4KB,要设置合理,不然会造成碎片过多,造成内存的浪费。
“块大小”:默认4K。不是4K的整数倍的内存需求,需要向上取整分配,因此产生内部碎片。

query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数
“总大小”:query_cache的总大小,因为mysql是自己管理内存的,query_cache_size是mysql从操作系统批发来的总内存大小。query_cache在这个范围内分配,如果超过这个范围,就开始驱逐。

query_cache_type:控制 Query Cache 功能的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别如下:
“缓存开关”:关闭,打开(默认全缓存+指定不缓存,默认全不缓存+指定缓存)。

0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache

1(ON):开启 Query Cache 功能,但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache

2(DEMAND):开启 Query Cache 功能,但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache

query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。默认false   (这个开关没太理解什么意思)

----

show status like 'Qcache%' ;

 

query_cache_size: “总内存”大小。
Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量  (空闲内存大小)
Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目  (“空闲块数量”)
Qcache_total_blocks:Query Cache 中总的 Block 数量    (“总块数量”)


Qcache_hits:Query Cache 命中次数
Qcache_inserts:向Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量   (缓存池中有多少个Query正被缓存着)
Qcache_lowmem_prunes:Query Cache 因为内存不够,而从中删除老的Query Cache的次数。   (驱逐的个数)

当一次query过来,对于缓存,要么命中,则hits;要么没命中,则为了未来命中,需要向缓存中插入inserts。 当然也有第三种情况:既没有命中缓存,又不插入缓存。 这种情况发生在(1)结果集超过1M;(2)SQL中含有不定值函数,比如current_date 。

Query Cache 命中率= Qcache_hits/(Qcache_hits+Qcache_inserts) ; Query Cache 的大小设置一般不要超过256MB。

如果从查询缓存中返回一个查询结果,服务器把Qcache_hits状态变量的值加一,而不是Com_select变量。

分享到:
评论

相关推荐

    MySQL高速缓存启动方法及参数详解(query_cache_size)

    会发现其变量have_query_cache的值是yes,MYSQL初学者很容易以为这个参数为YES就代表开启了查询缓存,实际上是不对的,该参数表示当前版本的MYSQL是否支持Query Cache,实际上是否开启查询缓存是看另外一个参数的值:...

    对于mysql的query_cache认识的误区

    如果空格是加在query之前,比如是在query的起始处加了空格,这样是丝毫不影响query cache的结果的,mysql认为这是一条query, 而如果空格是在query中,那会影响query cache的结果,mysql会认为是不同的query

    Mycat处理连接数据库8.0以上程序报错query_cache_size

    mycat连接数据库8.0以上用1.6.4有bug,经常无法插入;使用1.6.5以上版本 程序连接报错query_cache_size。 本资源基于1.6.7基础之上进行优化

    解决mycatJDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size'

    基于源码修改JDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size' ,配置好mycat相应配置直接bin目录启动即可

    MySQL的Query Cache原理分析

    原理 QueryCache(下面简称QC)是根据SQL语句来cache的。一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC。每个Cache都是以SQL文本作为key来存的。在应用QC之前,SQL文本不会被作任何处理。也就是说,...

    mysql select缓存机制使用详解

    mysql Query Cache 默认为打开。从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过query_cache_type【0(OFF)1...

    MySQL 5.6 Reference Manual

    Table of Contents Preface, Notes, Licenses . . . . . . . . ....1. Licenses for Third-Party Components ....1.1. FindGTest.cmake License ....1.2. LPeg Library License ....1.3. LuaFileSystem Library License ....

    MSQL问题集合,线上环境到底要不要开启query cache

    MSQL问题集合,线上环境到底要不要开启query cache

    MySQL取消了Query Cache的原因

    MySQL之前有一个查询缓存Query Cache,从8.0开始,不再使用这个查询缓存,那么放弃它的原因是什么呢?在这一篇里将为您介绍。 MySQL查询缓存是查询结果缓存。它将以SEL开头的查询与哈希表进行比较,如果匹配,则返回...

    Mysql一些调优资料收集

    自己整理的一些关于调优的资源;只要是mysql的QueryCache 缓存的处理 及其他解决方案

    mysql缓存查询和设置

    mysql缓存查询和设置global_query_cache_size

    MySQL性能调优与架构设计(中文版)

     8.1 理解MySQL的Query Optimizer  ……  第9章 MySQL数据库Schema设计的性能优化  第10章 MySQL Server性能优化  第11章 常用存储引擎优化 第3篇 架构设计篇  第12章 MySQL可扩展设计的基本原则  第13...

    MySQL性能调优与架构设计.mobi

    如 MySQL Schema 设计的技巧,Query 语句的性能优化方式方法及MySQL Server中SQL层和存储引擎层的优化思路。同时还分析了 MySQL 数据库中主要存储引擎的锁定机制。架构设计篇则主要以设计一个高可用可扩展的分布式...

    mysql参数及其优化

    query_cache_size、query_cache_type、innodb_buffer_pool_size、innodb_log_file_size、innodb_log_buffer_size、innodb_flush_logs_at_trx_commit、transaction_isolation、innodb_file_per_table、innodb_open_...

    mysql数据库my.cnf配置文件

    # MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64 # 假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件...

    MySQL全局共享内存介绍

    全局共享内存则主要是 MySQL Instance(mysqld进程)以及底层存储引擎用来暂存各种全局运算及可共享的暂存信息,如存储查询缓存的 Query Cache,缓存连接线程的 Thread Cache,缓存表文件句柄信息的 Table Cache,...

    MySQL性能调优与架构设计(PDF)

    如 MySQL Schema 设计的技巧,Query 语句的性能优化方式方法及MySQL Server中SQL层和存储引擎层的优化思路。同时还分析了 MySQL 数据库中主要存储引擎的锁定机制。架构设计篇则主要以设计一个高可用可扩展的分布式...

Global site tag (gtag.js) - Google Analytics