Mysql 的查詢快取引數介紹與優化思路
阿新 • • 發佈:2019-02-14
以下內容都是來自馬哥的分享,雖然都是收費的,但是值得一看(我絕不是拖啊!),涉及到的資料都是伺服器的真實資料,可以自己做個計算還是挺有趣的!
查詢快取的引數說明(my.cnf
)
mysql> show global variables like "query_cache%";
Variable_name | Value | desc |
---|---|---|
query_cache_limit |
1048576 | Mysql允許快取的單個快取物件的最大值 ,不過mysql只有在查詢的所有結果都返回後才知道其是否超出此大小,但是在查詢一開始便會嘗試使用快取儲存查詢結果,一旦發現超過可快取最大值則會從快取中將其刪除,並增大Qcache_not_cached SQL_NO_CACHE |
query_cache_min_res_unit |
4096 | 儲存快取的最小記憶體塊 ,這個值過小,會減少空間浪費,但是會導致更頻繁的記憶體塊申請操作,設定的過大,會有著更高的碎片產生率,可以通過(query_cache_size - Qcache_free_memory) / Qcache_queryer_in_cache 來獲得一個接近理想的值,同時,如果Qcache_free_blocks存在空閒塊,但是Qcache_lowmem_prunes的值仍然在增長,則表明碎片過多導致了快取結果會過早刪除 |
query_cache_size |
33554432 | 查詢快取的記憶體總大小 ,其必須是1024的整數倍,單位為位元組。Mysql啟動時,一次性分配並且初始化這裡指定大小的記憶體空間,改變其值,mysql會立刻刪除所有的快取物件並重新配置其大小及初始化,在效能較強的通用伺服器上,查詢快取可能會成為影響伺服器擴充套件的因素,因為它存在成為伺服器資源競爭單點的可能性,在多核心的伺服器上甚至還有可能導致服務程序宕機 |
query_cache_type |
ON | 是否開啟查詢快取 ,其可用值有OFF,ON和DEMAND,DEMAND僅在查詢語句中顯式使用SQL_CACHE時才會使用快取 |
query_cache_wlock_invalidate |
OFF | 如果某個資料表被其它的連結鎖住,是否仍然從查詢快取中返回結果。OFF表示返回 |
MySql執行產生的狀態值
mysql> show global status like 'qcache%';
Variable_name | Value | desc |
---|---|---|
Qcache_free_blocks | 1057 | 已經分配了塊,但是尚未儲存資料 , 如果該值顯示較大,則說明Query Cache 中的記憶體碎片較多了,可能需要尋找合適的機會進行整理。 |
Qcache_free_memory | 21667632 | 沒有被申請劃分為資料塊的部分 |
Qcache_hits | 2379301 | 快取命中次數 |
Qcache_inserts | 412811 | 執行向快取中插入快取物件的次數 |
Qcache_lowmem_prunes | 0 | 因為記憶體太小不能繼續儲存的物件個數 , 如果Qcache_lowmem_prunes 值比較大,表示查詢快取區大小設定太小,需要增大。 |
Qcache_not_cached | 1248823 | 查詢沒被快取的個數 |
Qcache_queries_in_cache | 1804 | 儲存在快取中的查詢個數 |
Qcache_total_blocks | 5043 | 已經分配好的塊個數 |
如何確定MySql中是否快取了剛才執行的SQL語句
mysql中的快取是 key-value hash
hash區分大小寫
MySql那些東西不會被快取
- 不確定性的內容
- 使用者自定義函式
- 使用者自定義變數
- 臨時表
- mysql用的系統表
- 列級別的許可權
- 儲存函式
- 不確定資料
命中率估算
mysql> show global status where variable_name="Qcache_hits" or variable_name="Com_select";
Variable_name | Value |
---|---|
Com_select | 1703848 |
Qcache_hits | 2421498 |
1. hits rate(命中率)
= Qcache_hits/(Qcache_hits+Com_select)
不過。這個未必能反應真實情況! 命中率>30%
就可以認為有效
2. 也應該經常查詢另一個指標,命中和寫入
的比率,即Qcache_hits
和Qcache_insert
的比值,次比例大於3:1
時通常查詢快取是有效的,能達到甚至大於10:1就更好了。
快取整理操作
FLUSH QUERY_CACHE
, 命令可以用於完成碎片整理,但會導致伺服器系統僵死一段時間- 要清空快取,可以使用
RESET QUERY_CACHE
通用快取優化思路
- 批量寫入而非單個寫入,批量寫入僅一次性影響快取
- 過大的快取空間會使的在大量快取物件過期失效時導致伺服器假死
- 必要時,使用
SQL_CACHE
和SQL_NO_CACHE
手動控制快取動作。 - 對寫密集型的場景來說,禁用快取可以提高效能。
- 如果Qcache_lowmem_prunes 值比較大,表示查詢快取區大小設定太小,需要增大。