深度解析MySQL查询缓存机制

数据库 MySQL
查询是MySQL数据库的核心,而查询缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。

MySQL查询缓存机制是MySQL数据库中的重要机制之一,下面将为您深入分析MySQL查询缓存机制,供您参考学习之用。

MySQL缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。如果表更改 了,那么使用这个表的所有缓冲查询将不再有效,查询缓存值的相关条目被清空。更改指的是表中任何数据或是结构的改变,包括INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询。显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有 大量相同sql查询的表,查询缓存会节约很大的性能。

查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。

下面sql查询缓存认为是不同的:

  1. SELECT * FROM tbl_name  
  2. Select * from tbl_name  

查询缓存相关参数

  1. mysql> SHOW VARIABLES LIKE '%query_cache%';  
  2. +------------------------------+---------+  
  3. | Variable_name                | Value   |  
  4. +------------------------------+---------+  
  5. | have_query_cache             | YES     | --查询缓存是否可用  
  6. | query_cache_limit            | 1048576 | --可缓存具体查询结果的最大值  
  7. | query_cache_min_res_unit     | 4096    |   
  8. | query_cache_size             | 599040  | --查询缓存的大小  
  9. | query_cache_type             | ON      | --阻止或是支持查询缓存  
  10. | query_cache_wlock_invalidate | OFF     |   
  11. +------------------------------+---------+  

下面是一个简单的MySQL查询缓存机制例子:

  1. [mysql@csdba1850 ~]$ mysql -u root -p  
  2. Enter password:   
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.  
  4. Your MySQL connection id is 3  
  5. Server version: 5.0.45-community MySQL Community Edition (GPL)  
  6.  
  7. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.  
  8.  
  9. mysql> set global query_cache_size = 600000; --设置缓存内存  
  10. Query OK, 0 rows affected (0.00 sec)  
  11.  
  12. mysql> set session query_cache_type = ON; --开启查询缓存  
  13. Query OK, 0 rows affected (0.00 sec)  
  14.  
  15. mysql> use test  
  16. Reading table information for completion of table and column names  
  17. You can turn off this feature to get a quicker startup with -A  
  18.  
  19. Database changed  
  20. mysql> show tables;  
  21. +----------------+  
  22. | Tables_in_test |  
  23. +----------------+  
  24. | animals        |   
  25. | person         |   
  26. +----------------+  
  27. 5 rows in set (0.00 sec)  
  28.  
  29. mysql> select count(*) from animals;  
  30. +----------+  
  31. | count(*) |  
  32. +----------+  
  33. |        6 |   
  34. +----------+  
  35. 1 row in set (0.00 sec)  
  36.  
  37. --Qcache_hits表示sql查询在缓存中命中的累计次数,是累加值。  
  38. mysql> SHOW STATUS LIKE 'Qcache_hits';  
  39. +---------------+-------+  
  40. | Variable_name | Value |  
  41. +---------------+-------+  
  42. | Qcache_hits   | 0     |  --0次  
  43. +---------------+-------+  
  44. 8 rows in set (0.00 sec)  
  45.  
  46. mysql>  select count(*) from animals;  
  47. +----------+  
  48. | count(*) |  
  49. +----------+  
  50. |        6 |   
  51. +----------+  
  52. 1 row in set (0.00 sec)  
  53.  
  54. mysql>  SHOW STATUS LIKE 'Qcache%';  
  55. +---------------+-------+  
  56. | Variable_name | Value |  
  57. +---------------+-------+  
  58. | Qcache_hits   | 1     | --表示sql在缓存中直接得到结果,不需要再去解析  
  59. +---------------+-------+  
  60. 8 rows in set (0.00 sec)  
  61.  
  62. mysql> select count(*) from animals;  
  63. +----------+  
  64. | count(*) |  
  65. +----------+  
  66. |        6 |   
  67. +----------+  
  68. 1 row in set (0.00 sec)  
  69.  
  70. mysql> select count(*) from animals;  
  71. +----------+  
  72. | count(*) |  
  73. +----------+  
  74. |        6 |   
  75. +----------+  
  76. 1 row in set (0.00 sec)  
  77.  
  78. mysql> SHOW STATUS LIKE 'Qcache_hits';  
  79. +---------------+-------+  
  80. | Variable_name | Value |  
  81. +---------------+-------+  
  82. | Qcache_hits   | 3     |    --上面的sql也是是从缓存中直接取到结果  
  83. +---------------+-------+  
  84. 1 row in set (0.00 sec)  
  85.  
  86. mysql> insert into animals select 9,'testsds' ; --插入数据后,跟这个表所有相关的sql缓存就会被清空掉  
  87. Query OK, 1 row affected (0.00 sec)  
  88. Records: 1  Duplicates: 0  Warnings: 0  
  89.  
  90. mysql> select count(*) from animals;  
  91. +----------+  
  92. | count(*) |  
  93. +----------+  
  94. |        7 |   
  95. +----------+  
  96. 1 row in set (0.00 sec)  
  97.  
  98. mysql> SHOW STATUS LIKE 'Qcache_hits';  
  99. +---------------+-------+  
  100. | Variable_name | Value |  
  101. +---------------+-------+  
  102. | Qcache_hits   | 3    |  --还是等于3,说明上一条sql是没有直接从缓存中直接得到的  
  103. +---------------+-------+  
  104. 1 row in set (0.00 sec)  
  105.  
  106. mysql> select count(*) from animals;  
  107. +----------+  
  108. | count(*) |  
  109. +----------+  
  110. |        7 |   
  111. +----------+  
  112. 1 row in set (0.00 sec)  
  113.  
  114. mysql> SHOW STATUS LIKE 'Qcache_hits';   
  115. +---------------+-------+  
  116. | Variable_name | Value |  
  117. +---------------+-------+  
  118. | Qcache_hits   | 4     |   
  119. +---------------+-------+  
  120. 1 row in set (0.00 sec)  

 

 

 

【编辑推荐】

MySQL无重复查询的实现

五种常用的MySQL命令行

修复mysql表的两种方法

php中数组插入mysql表的方法

MySQL条件查询语句的用法

责任编辑:段燃 来源: 互联网
相关推荐

2010-10-13 16:44:10

MySQL查询缓存机制

2011-08-02 18:07:03

iPhone 内省 Cocoa

2016-10-09 14:41:40

Swift开发ARC

2011-06-22 16:50:09

Qt 进程 通信机制

2010-10-14 15:59:30

MySQL查询缓存变量

2024-05-06 00:00:00

GAC代码缓存

2009-09-17 09:11:26

LINQ查询

2010-11-23 11:36:15

MySQL创建关联表

2024-11-14 07:10:00

2009-06-17 15:43:03

Hibernate缓存

2023-02-24 16:46:25

Glide缓存机制

2019-07-11 08:45:00

MySQL数据库缓存

2010-11-25 10:00:33

MySQL查询缓存

2010-05-19 12:44:58

2010-06-02 13:33:19

MySQL 查询缓存

2020-12-21 09:00:04

MySQL缓存SQL

2021-05-07 09:25:34

数据库工具技术

2021-05-13 14:34:34

数据库PolarDB

2010-11-12 10:53:28

微软Azure

2024-10-12 12:55:26

点赞
收藏

51CTO技术栈公众号