MySQL 查询缓存

£神魔★判官ぃ 2022-01-29 05:19 317阅读 0赞

查询缓存是用来缓存一个查询SQL的结果集,下次执行相同SQL时,直接从查询缓存里取得已有的结果,而不需要重新对SQL解析,优化,执行。
查询缓存是会话间共享的,即不同会话执行相同的SQL,都可以从查询缓存中直接取得结果。
相同的SQL,意味着谓词条件以及大小写都要严格一致。

在使用查询缓存之前,MySQL依然会检查用户对查询对象的权限,没有权限则无法使用查询缓存。

每次使用查询缓存,会使状态变量qcache_hits加1,但com_select不变。

控制查询缓存的参数
1.have_query_cache,查询缓存功能是否可用
mysql> SHOW VARIABLES LIKE ‘have_query_cache’;

  1. +------------------+-------+
  2. | Variable_name | Value |
  3. +------------------+-------+
  4. | have_query_cache | YES |
  5. +------------------+-------+
  1. query_cache_size,单位bytes,查询缓存大小,设为0表示关闭查询缓存,必须是1024的倍数,查询缓存至少需要40KB。
  2. query_cache_type,查询缓存类型,取值为0|off,1|on,2|demand,1时缓存所有查询,2时只有在select sql_cache时才缓存查询

开启查询缓存
配置query_cache_size大于0和query_cache_type不为0|off时,即开启查询缓存。
关闭查询缓存
query_cache_size=0或query_cache_type=0|off

查询缓存不生效的情况
在以下情况下,即使SQL严格一致,也不会缓存查询:
1.子查询
2.函数、触发器、事件里的SQL

当SQL使用了以下这些函数,将不会进行查询缓存
• AES_DECRYPT()
• AES_ENCRYPT()
• BENCHMARK()
• CONNECTION_ID()
• CONVERT_TZ()
• CURDATE()
• CURRENT_DATE()
• CURRENT_TIME()
• CURRENT_TIMESTAMP()
• CURRENT_USER()
• CURTIME()
• DATABASE()
• ENCRYPT() with one parameter
• FOUND_ROWS()
• GET_LOCK()
• IS_FREE_LOCK()
• IS_USED_LOCK()
• LAST_INSERT_ID()
• LOAD_FILE()
• MASTER_POS_WAIT()
• NOW()
• PASSWORD()
• RAND()
• RANDOM_BYTES()
• RELEASEALLLOCKS()
• RELEASE_LOCK()
• SLEEP()• SYSDATE()
• UNIX_TIMESTAMP() with no parameters
• USER()
• UUID()
• UUID_SHORT()

对于SQL出现以下情况,也不会进行查询缓存
1.使用了用户自定义的函数;
2.使用了用户自定义变量或者其他程序里的本地变量;
3.SQL同时查询了mysql, INFORMATION_SCHEMA,performance_schema三个数据库中的一个或多个;
4.查询了分区表;
5.使用了以下这些语法:

  1. SELECT ... LOCK IN SHARE MODE
  2. SELECT ... FOR UPDATE
  3. SELECT ... INTO OUTFILE ...
  4. SELECT ... INTO DUMPFILE ...
  5. SELECT * FROM ... WHERE autoincrement_col IS NULL

6.使用了临时表;
7.没有查询任何表;
8.产生warnings;
9.只拥有查询表的部分列权限。

查询缓存会失效
一旦一个表发生了数据变更,该表对应的查询缓存就会失效,在执行相同SQL时需要重新维护查询缓存,所以对于变更频繁的数据库,查询缓存的作用几乎为零。会使查询缓存失效的操作例如有:
INSERT, UPDATE, DELETE, TRUNCATE TABLE, ALTER TABLE, DROP TABLE, DROP DATABASE

不建议开启查询缓存
由于表的更新会导致查询缓存失效,通常OLTP都是DML频繁的库,在这种情况下,维护查询缓存的代价高于查询缓存带来的好处,甚至查询缓存可能并不起任何作用,所以建议将查询缓存关闭。
在MySQL8.0里已经把查询缓存的功能删除了。

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql查询缓存

    mysql查询缓存    > 查询缓存(Cache&Buffer),这是MySQL的一个可优化查询的地方;如果开启了查询缓存,之前执行过的语句及其结果可能会以 key-

    相关 [高性能MySQL]--查询缓存

    简单点说,就是对于相同SQL可以跳过SQL解析和执行计划生成阶段,直接返回缓存的结果。也就是缓存完整的SELECT 查询结果。 1. MySQL查询缓存: 缓存存放在一

    相关 Mysql 查询缓存

    Mysql 查询缓存 查询缓存的作用就是当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询。这样就大大提高了性能,节省时间。

    相关 启用MySQL查询缓存

    1、启用MySQL查询缓存好处: 可以极大地减低数据库服务器的CPU使用率,实际使用情况是:开启前CPU使用率120%左右,开启后降到了10%。 2、查看查询缓存情况:

    相关 MySQL 查询缓存

    查询缓存是用来缓存一个查询SQL的结果集,下次执行相同SQL时,直接从查询缓存里取得已有的结果,而不需要重新对SQL解析,优化,执行。 查询缓存是会话间共享的,即不同会话执

    相关 MYSQL-查询缓存

    查询的执行路径 ![MYSQL-查询缓存][MYSQL-] 过程: > 数据默认是放在磁盘上的文件,如果我们每次查询都要去磁盘上查找,效率是非常低下的。但是我们把