程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 深度解析MySQL查詢緩存機制

深度解析MySQL查詢緩存機制

編輯:MySQL綜合教程

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條件查詢語句的用法

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved