8.10.3 The MySQL Query Cache

8.10.3 The MySQL Query Cache
[+/-]

8.10.3.1 How the Query Cache Operates
8.10.3.2 Query Cache SELECT Options
8.10.3.3 Query Cache Configuration
8.10.3.4 Query Cache Status and Maintenance

query cache 存储了SELECT 语句连同相应的结果(发送到客户端的)的文本信息,

如果后来收到相同的语句,server从query cache 检索结果相比再次解析和执行SQL语句。

query cache 在多个Sessions 之间共享,此一个客户端生成的结果集可以在另一个客户端发出的相同的查询中发送。

query cache 是可用的 在一个你的表不经常改变,服务器接收到许多相同的查询,这是一个情况对于很多的Web Servers

生成很多的动态页面基于数据库内容。

查询缓存不返回过期数据,当表数据被修改, 任何相关的条件在query cache 会被刷新。

注意:

查询缓存不支持工作在有多个mysqld server更新同样的MyISAM表:

query cache 用于预备的语句

一些性能数据用于query cache 如下:

如果你执行的所有的查询都很简单(比如从一个表中选择一行), 但仍有不同,因此queries 不能被cached.

query cache 活动的负载是13%, 这可能被视为最坏的情况。在现实生活中,查询往往要复杂得多,所以开销通常较低。

在一个只有一行的表中检索一行记录是238%使用query cache的情况下,这个可以被认为是最接近最低加速。

禁用服务器启动query cache, 设置query_cache_size 系统变量为0,通过禁用查询缓存代码,没有明显的开销。

query cache 提供了潜在的真正的性能改进,但是不要假设它在所有情况下都会改善。

一些查询配置或者服务器负载,你可能会看到性能下降:

对query cache缓存的大小要谨慎, 这个增加了维护cache的开销,可能超出了开启它的好处,在几十兆的大小通常是有益的。在百兆的大小可能不。

服务器股灾对query cache 效率有显著的影响,一个查询混合组成几乎整个固定的一组SELECT 语句是更好好处的启用query cace

相比一个混合频繁的INSERT 语句导致连续失效的cache的结果。在有些情况下,一个解决方法是使用sql_no_cache选项来防止结果甚至进入缓存SELECT语句,使用频繁修改的表。

8.10.3.1 How the Query Cache Operates Mysql Query Cache 如何操作:

这个章节描述了query cache 如何工作,但它操作的时候。

插入的查询和那些在query cache(在解析前相比),因此下面两个查询被认为是不同的:

SELECT * FROM tbl_name
Select * from tbl_name

查询必须是完全相同的(逐字节比较),此外,查询字符串是完全一样会被视为不同由于其他原因,

查询使用不同的数据库,不同的协议,或者不同的字符集设置是被认为不同的查询被单独缓存:

query cache 不能用于下面类型的查询:

查询是另外一个外部查询的子查询:

查询在存储过程函数,触发器或者event里被执行

在从query cache 里获取查询结果前,MySQL 检查是否用户有SELECT 权限对于所有的数据库和表, 如果没有,cached result 不会被使用:

如果查询结果是从query cache返回,server 增加 Qcache_hits 变量,不是Com_select。

如果一个表变化了,所有的cached queries 表使用的都变的不可用,从cache 中删除。

一个表被改变有很多种类型的语句:, such as INSERT, UPDATE, DELETE, TRUNCATE TABLE, ALTER TABLE, DROP TABLE, or DROP DATABASE.

query cache 也可以用于事务当使用InnoDB表的时候:

在Mysql 5.6,一个SELECY 查询在一个VIEW 上也会cached:

查询缓存用于 SELECT SQL_CALC_FOUND_ROWS 查询和存储SELECT FOUND_ROWS() query 返回的值。

FOUND_ROWS() 返回正确的值, 尽管它前面的查询被回去从cache中,因为找到的记录也会存储在cache中。

SELECT FOUND_ROWS() query 它本身不能被cached.

准备好的语句被执行使用binary 协议使用mysql_stmt_prepare() 和mysql_stmt_execute()

受限制于cache,于query cache中的语句比较是基于展开后的语句的文本?参数标记

8.10.3.2 Query Cache SELECT Options Query Cache 查询选项

两个查询相关的选项可以被指定在SELECT语句:

SQL_CACHE

查询结果是缓存的,如果它是可以cache的,query_cache_type的值是ON或者DEMAND:

SQL_NO_CACHE

服务器不能使用查询缓存,它不检查query cache 来查看结果是否已经被cached,

(由于解析器的限制,一个空格字符必须前缀,跟着SQL_NO_CACHE 关键字)

Examples:

SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;

8.10.3.3 Query Cache Configuration Query Cache 配置

have_query_cache server 变量表明是否query cache 是可用的:

mysql> SHOW VARIABLES LIKE ‘have_query_cache’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| have_query_cache | YES |
+——————+——-+

使用标准的MySQL 2进制,这个值是YES, 即使如果query caching 被禁用:

其他几个系统变量控制query cache 操作,这些可以设置在一个选项文件或者在命令上当MySQL启动的时候。

query cache 系统变量都是以query_cache_开头的

设置query cache的大小,设置query_cache_size 变量,设置它为0表示关闭query cache,

当设置为query_cache_type=0。默认的,查询cache是被关闭了,

这个是使用默认设置为1M, 默认的query_cache_type是0

mysql> show variables like ‘%query_cache_type%’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| query_cache_type | OFF |
+——————+——-+
1 row in set (0.00 sec)

不cache results in 或者不从query 检索结果,注意这个不重新分配query cache buffer

这样做, 你需要设置query_cache_size 为0

query_cache_type:

The have_query_cache server system variable indicates whether the query cache is available:
have_query_cache参数是说 query cache 是否可用,类似插件是否安装的意思。

query_cache_type:注意这个不重新分配query cache buffer,关闭query cache 你需要设置 query_cache_size to 0

query_cache_type:
0 or OFF Do not cache results in or retrieve results from the query cache.

Note that this does not deallocate the query cache buffer. To do that, you should set query_cache_size to 0.

不进行cache results in 或者从query cache 检索记录,

query_cache_type:注意这个不重新分配query cache buffer,关闭query cache 你需要设置 query_cache_size to 0

如果服务器在开的时候设置query_cache_type 为0, 它根本不能获得query chace mutex,

意味着query cache 不能被启用在运行时间,会降低查询执行的开销。

降低开销,设置query_cache_type=0 如果你不使用query cache

注意:

当使用Windows 配置向导来安装和配置MySQL的时候,query_cache_size默认的值不会被自动配置,

对于你基于不同的配置类型。

当你设置query_cache_size 为一个非0的值, 记住query cache 需要一个最小值40KB的分配结构

SET GLOBAL query_cache_size = 40000;

SET query_cache_size = 40000;

mysql> SET query_cache_size = 40000;
ERROR 1229 (HY000): Variable ‘query_cache_size’ is a GLOBAL variable and should be set with SET GLOBAL

mysql> show variables like ‘%commit%’;
+——————————–+——-+
| Variable_name | Value |
+——————————–+——-+
| autocommit | ON |
| binlog_order_commits | ON |
| innodb_api_bk_commit_interval | 5 |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+——————————–+——-+
5 rows in set (0.01 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘%commit%’;
+——————————–+——-+
| Variable_name | Value |
+——————————–+——-+
| autocommit | OFF |
| binlog_order_commits | ON |
| innodb_api_bk_commit_interval | 5 |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+——————————–+——-+
5 rows in set (0.01 sec)

mysql> quit
Bye
You have new mail in /var/spool/mail/root
test:/root# mysql -uroot -p’kjk123’

mysql> show variables like ‘%commit%’;
+——————————–+——-+
| Variable_name | Value |
+——————————–+——-+
| autocommit | ON |

query_cache_size 的值是对齐接近1024字节的块,

如果query cache size 是大于0,query_cache_type 变量影响它的行为,这个变量可以设置为如下:

0或者OFF的值, 防止缓存或者检索缓存的结果。

值是1或者ON启用caching 除非那些语句使用SELECT SQL_NO_CACHE.

2或者DEMAND 只缓存那些SELECT SQL_CACHE的语句

如果query_cache_size 设置为0, 你需要设置 query_cache_type 为0.

在这种情况下, 服务器不获得query cache mutex , 意味着query cache 不被启用。

8.10.3.4 Query Cache Status and Maintenance 查询 cache 状态和维护

检查是否query cache 是存在于你的MySQL SERVER的,使用下面的语句:

mysql> SHOW VARIABLES LIKE ‘have_query_cache’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| have_query_cache | YES |
+——————+——-+

你可以整理 query cache 更好的使用它的内存 使用 FLUSH QUERY CACHE 语句,

这个语句不移动任何的查询在cache里。

原文地址:https://www.cnblogs.com/hzcya1995/p/13351402.html