MySQL query_cache_type的DEMAND引數介紹和使用舉例
Query Cache儲存SELECT語句及其產生的資料結果,特別適用於表資料變化不是很頻繁的場景,例如一些靜態頁面,
或者頁面中的某塊不經常發生 變化的資訊。如果此表上有任何寫表操作發生,那麼和這個表相關的所有快取都將失效。
由於Query Cache需要快取最新資料結果,因此表資料 發生任何變化(INSERT、UPDATE、DELETE或其他有可能產生
資料變化的操作),都會導致Query Cache被重新整理。對於更新壓力大的資料庫來說,查詢快取的命中率也會非常低。
但我們可以將引數 query_cache_type 設定成 DEMAND(按需及用)方式,這樣對於預設的SQL語句不使用查詢快取,
而對於確定要使用query cache的SQL語句, 可以用sql_cache的方法指定,例如:
select sql_cache * from table_name;
或 select sql_cache count(*) from table_name;
以下是query_cache_type三個引數的含義:
query_cache_type=0(OFF)關閉
query_cache_type=1(ON)快取所有結果,除非select語句使用SQL_NO_CACHE禁用查詢快取
query_cache_type=2(DEMAND),只快取select語句中透過SQL_CACHE指定需要快取的查詢
修改為DEMAND方式:
vi /etc/my.cnf,加入如下行:
query_cache_type =2
儲存並重啟mysql
mysql5.7版本如果直接修改可能會報錯:
mysql>set global query_cache_type=2;
ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it
檢視是否開啟DEMAND引數:
mysql>show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | DEMAND |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
6 rows in set (0.44 sec)
mysql>>show global status like '%Qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1031832 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 3 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+---------+
8 rows in set (0.14 sec)
相關引數解釋如下:
Qcache_free_blocks:表示查詢快取中目前還有多少剩餘的blocks,如果該值顯示較大,說明查詢快取中的記憶體碎片過多。
Qcache_free_memory:表示Query Cache中目前剩餘的記憶體大小。
Qcache_hits:表示有多少次命中快取。
Qcache_inserts: 表示多少次未命中快取然後插入,意思是新來的SQL請求如果在快取中未找到,不得不執行查詢處理,執行查詢處理後把結果insert到查詢快取中。
Qcache_lowmem_prunes:該引數記錄有多少條查詢因為記憶體不足而被移出查詢快取。
Qcache_not_cached: 表示因為query_cache_type的設定而沒有被快取的查詢數量。
Qcache_queries_in_cache:當前快取中快取的查詢數量。
Qcache_total_blocks:當前快取的block數量。
執行一次查詢:
>select count(*) from test;
+----------+
| count(*) |
+----------+
| 36675 |
+----------+
1 row in set (0.41 sec)
然後執行show status like '%Qcache%',看看有什麼變化:
mysql>show global status like '%Qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1031832 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 4 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+---------+
8 rows in set (0.01 sec)
Qcache_hits為0.
再次執行select count(*) from test;
mysql>select count(*) from test;
+----------+
| count(*) |
+----------+
| 36675 |
+----------+
1 row in set (0.02 sec)
mysql>show global status like '%Qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1031832 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 5 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+---------+
8 rows in set (0.00 sec)
Qcache_hits依舊為0,說明沒有使用Query Cache.
加sql_cache執行一下語句,看看有什麼變化:
mysql>select sql_cache count(*) from test;
+----------+
| count(*) |
+----------+
| 36675 |
+----------+
1 row in set, 1 warning (0.00 sec)
mysql>show global status like '%Qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1030296 |
| Qcache_hits | 1 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 5 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+---------+
8 rows in set (0.00 sec)
可以看到Qcache_hits的值變為了1,再次執行:
mysql>select sql_cache count(*) from test;
+----------+
| count(*) |
+----------+
| 36675 |
+----------+
1 row in set, 1 warning (0.00 sec)
mysql>show global status like '%Qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1030296 |
| Qcache_hits | 2 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 5 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+---------+
8 rows in set (0.01 sec)
可以看到Qcache_hits的值變為了2,每次執行都累加1,說明使用了query cache。
備註:從MySQL 8.0版本以後直接取消了查詢快取的整塊功能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2640129/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql一些引數的介紹MySql
- Python qutip用法(舉例介紹)Python
- MongoDB Sharding Balancer介紹和設定方法舉例MongoDB
- MySQL change buffer介紹和相關引數調整建議MySql
- mysql二進位制日誌的引數介紹MySql
- impdp和expdp用法及引數介紹
- mysql 複製引數replicate_do_db和replicate_ignore_db介紹MySql
- jmeter引數化介紹JMeter
- Rman關於filesperset引數的介紹
- 3個例項介紹shell指令碼中幾個特殊引數的用法指令碼
- Linux核心引數overcommit_memory和OOM killer介紹LinuxMITOOM
- LayerMask 的介紹和使用
- BlockingQueue 的介紹和使用BloC
- zblog獲取GET/POST等值函式“GetVars”引數和使用方法介紹函式
- 簡單介紹Python drop方法刪除列之inplace引數例項Python
- MySQL MRR和ICP介紹MySql
- MySQL Batched Key Access (BKA)原理和設定使用方法舉例MySqlBAT
- MySQL觸發器的使用和優缺點介紹ZGMHMySql觸發器
- MySQL資料備份多種引數介紹及簡單示例MySql
- Travis CI 配置檔案 .travis.yml 的語法介紹和一些用法舉例
- tensorflow學習率指數衰減ExponentialDecay的引數介紹與使用方法
- web worker的介紹和使用Web
- MySQL日誌引數配置簡介MySql
- Redis介紹和使用Redis
- The Graph介紹和使用
- MySQL壓測工具mysqlslap的介紹與使用MySql
- mysql各個記憶體引數的介紹,分執行緒獨享和全域性共享兩大類MySql記憶體執行緒
- 介紹tomcat Connector 引數優化說明Tomcat優化
- mysqldump中skip-tz-utc引數介紹MySql
- hping3功能以及引數介紹
- HTC VIVE Pro裝置引數配置介紹
- MySql介紹MySql
- clang-format的介紹和使用ORM
- Web Storage API的介紹和使用WebAPI
- MySQL Undo Log和Redo Log介紹MySql
- iOS Runtime介紹和使用iOS
- ddddocr基本使用和介紹
- Python JWT 介紹和使用PythonJWT