1. 程式人生 > 其它 >13. Mysql中查詢快取優化

13. Mysql中查詢快取優化

目錄

13.1 概述

開啟Mysql的查詢快取,當執行完全相同的SQL語句(語句完全一樣,甚至大小寫完全一致)的時候,伺服器就會直接從快取中讀取結果,當資料被修改,之前的快取會失效,修改比較頻繁的表不適合做查詢快取。

13.2 操作流程

  1. 客戶端傳送一條查詢給伺服器;
  2. 伺服器先會檢查查詢快取,如果命中了快取,則立即返回儲存在快取中的結果。否則進入下一階段;
  3. 伺服器端進行SQL解析、預處理,再由優化器生成對應的執行計劃;
  4. MySQL根據優化器生成的執行計劃,呼叫儲存引擎的API來執行查詢;
  5. 將結果返回給客戶端。

13.3 查詢快取配置

  1. 檢視當前的MySQL資料庫是否支援查詢快取:

    SHOW VARIABLES LIKE 'have_query_cache';	
    
  2. MySQL 8,已經取消了查詢快取。

  3. 檢視當前MySQL是否開啟了查詢快取 :

    SHOW VARIABLES LIKE 'query_cache_type';
    
  4. 檢視查詢快取的佔用大小 :

    SHOW VARIABLES LIKE 'query_cache_size';
    
  5. 檢視查詢快取的狀態變數:

    SHOW STATUS LIKE 'Qcache%';
    

    各個變數的含義如下:

    引數 含義
    Qcache_free_blocks 查詢快取中的可用記憶體塊數
    Qcache_free_memory 查詢快取的可用記憶體量
    Qcache_hits 查詢快取命中數
    Qcache_inserts 新增到查詢快取的查詢數
    Qcache_lowmen_prunes 由於記憶體不足而從查詢快取中刪除的查詢數
    Qcache_not_cached 非快取查詢的數量(由於 query_cache_type 設定而無法快取或未快取)
    Qcache_queries_in_cache 查詢快取中註冊的查詢數
    Qcache_total_blocks 查詢快取中的塊總數

13.4 開啟查詢快取

MySQL的查詢快取預設是關閉的,需要手動配置引數 query_cache_type , 來開啟查詢快取。query_cache_type 該引數的可取值有三個 :

含義
OFF 或 0 查詢快取功能關閉
ON 或 1 查詢快取功能開啟,SELECT的結果符合快取條件即會快取,否則,不予快取,顯式指定 SQL_NO_CACHE,不予快取
DEMAND 或 2 查詢快取功能按需進行,顯式指定 SQL_CACHE 的SELECT語句才會快取;其它均不予快取

在 /usr/my.cnf 配置中,增加以下配置 :

配置完畢之後,重啟服務既可生效 ;

然後就可以在命令列執行SQL語句進行驗證 ,執行一條比較耗時的SQL語句,然後再多執行幾次,檢視後面幾次的執行時間;獲取通過檢視查詢快取的快取命中數,來判定是否走查詢快取。

13.5 查詢快取SELECT選項

可以在SELECT語句中指定兩個與查詢快取相關的選項 :

SQL_CACHE : 如果查詢結果是可快取的,並且 query_cache_type 系統變數的值為ON或 DEMAND ,則快取查詢結果 。

SQL_NO_CACHE : 伺服器不使用查詢快取。它既不檢查查詢快取,也不檢查結果是否已快取,也不快取查詢結果。

例子:

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

13.6 查詢快取失效的情況

1) SQL 語句不一致的情況, 要想命中查詢快取,查詢的SQL語句必須一致。

# SQL1:select小寫select count(*) from tb_item;# SQL2:Select大寫Select count(*) from tb_item;

2) 當查詢語句中有一些不確定的時,則不會快取。如 : now() , current_date() , curdate() , curtime() , rand() , uuid() , user() , database() 。

SQL1 : select * from tb_item where updatetime < now() limit 1;SQL2 : select user();SQL3 : select database();

3) 不使用任何表查詢語句。

select 'A';

4) 查詢 mysql, information_schema或 performance_schema 資料庫中的表時,不會走查詢快取。(預設的系統資料庫)

select * from information_schema.engines;

5) 在儲存的函式,觸發器或事件的主體內執行的查詢。

6) 如果表更改,則使用該表的所有快取記憶體查詢都將變為無效並從快取記憶體中刪除。這包括使用MERGE對映到已更改表的表的查詢。一個表可以被許多型別的語句,如被改變 INSERT, UPDATE, DELETE, TRUNCATE TABLE, ALTER TABLE, DROP TABLE,或 DROP DATABASE 。