1. 程式人生 > >Mysql 的查詢快取引數介紹與優化思路

Mysql 的查詢快取引數介紹與優化思路

以下內容都是來自馬哥的分享,雖然都是收費的,但是值得一看(我絕不是拖啊!),涉及到的資料都是伺服器的真實資料,可以自己做個計算還是挺有趣的!

查詢快取的引數說明(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那些東西不會被快取

  1. 不確定性的內容
  2. 使用者自定義函式
  3. 使用者自定義變數
  4. 臨時表
  5. mysql用的系統表
  6. 列級別的許可權
  7. 儲存函式
  8. 不確定資料

命中率估算

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_hitsQcache_insert的比值,次比例大於3:1時通常查詢快取是有效的,能達到甚至大於10:1就更好了。

快取整理操作

  1. FLUSH QUERY_CACHE, 命令可以用於完成碎片整理,但會導致伺服器系統僵死一段時間
  2. 要清空快取,可以使用RESET QUERY_CACHE

通用快取優化思路

  1. 批量寫入而非單個寫入,批量寫入僅一次性影響快取
  2. 過大的快取空間會使的在大量快取物件過期失效時導致伺服器假死
  3. 必要時,使用SQL_CACHESQL_NO_CACHE手動控制快取動作。
  4. 對寫密集型的場景來說,禁用快取可以提高效能。
  5. 如果Qcache_lowmem_prunes 值比較大,表示查詢快取區大小設定太小,需要增大。