MySql Query Cache 查詢快取介紹(1)
MySql Query Cache 和 Oracle Query Cache 是不同的, Oracle Query Cache 是緩衝執行計畫的,而MySql Query Cache 不緩衝執行計畫而是整個結果集。緩衝整個結果集的好處不言而喻,但由於緩衝的是結果集因此Query必須是完全一樣的,這樣帶來的後果就是平均 Hit Rate 命中率一般不會太高。 Query Cache 對於一些小型應用程式或者資料表的資料量不大的情況下效果是最為明顯的。
作為一個新的特性,MySql Query Cache 有什麼特典和局限呢? 咱一個一個來說:
1、Cache 機制對應用程式是透明的。在應用程式中只是改變查詢語句的語義,也能得到緩衝中的查詢結果集。如果你沒有使用 query_cache_wlock_invalidate=ON 來提示MySql 鎖表將要進行寫操作,那麼此時的查詢即使表在鎖Lock狀態下或者預備更新的狀態下,仍然可以從緩衝中獲得結果集;
2、只緩衝整個查詢結果集,即對子查詢,內聯視圖和部分UNION的查詢是不緩衝的;
3、緩衝機制工作在Packet 層級,第二項的只緩衝整個查詢結果集就是因為局限於這個機制的原因。由於沒有額外的轉換和處理,所以保證緩衝結果集返回能夠非常快;
4、緩衝處理在解析查詢前進行,保證緩衝高效能的一個原因就是查詢快取在執行查詢解析前先尋找是否已經存在緩衝,如果已經存在查詢快取,則直接返回結果集。
5、查詢必須絕對完全同,由於在尋找緩衝是否存在前不進行查詢解析( Query Parser )所以查詢並沒有經過正常化處理(Normalized),因此緩衝尋找的過程是按位元組順序進行的 ( Byte by byte )。更具體點說吧:在每次查詢時包不同的注釋、多餘的空格以及大小寫不同等等,都不會指向同一個緩衝結果集。
6、只有 SELECT 語句被緩衝。 插入、刪除、更新當然不需要進行緩衝了,同時 SHOW 命令和 預存程序 stored procedure (包括預存程序中的SELECT)也不會進入緩衝結果集。
7、空格和注釋不要出現在查詢語句的最前面,當尋找緩衝時第一個字幕如果不是"S" ,就會停止查詢快取結果集了。第5、6項已經解釋過了;
8、不支援預備查詢 prepared statement 和 遊標 cursors 。 ( ? )
9、或許不支援交易處理。(?)
10、查詢結果必須完全一致,才能進入緩衝結果集。比如:查詢語句中有 UUID , RAND , CONNECTION_ID 等會動態改變查詢結果集的函數,都不會進入緩衝結果集的;
11、查詢快取失效的粒度層級的是表,當表被修改時,所有與改表相關的緩衝立即失效( invalidation )。
12、過長時間的查詢快取容易造成片段 fragmentation ,這一點和Windows的磁碟管理的磁碟重組類似,長時間查詢快取產生的片段對執行效率有一定影響。可以把查詢快取片段看作是是查詢快取可用記憶體(Qcache_free_memory)的塊(Qcache_free_blocks )。FLUSH QUERY CACHE 命令可以削除這種情況。
13、設定適當大小的查詢快取用的記憶體,由於前面提到的一些原因,一般情況下MySql 的查詢快取機制對記憶體的需求不可能無限增長,因此設定一個適當的查詢快取記憶體值是比較經濟的做法。可以通過查看 Qcache_free_memory 和 Qcache_lowmem_prunes 的狀態來進行適當設定。
14、查詢快取的運行模式,預設情況下開啟緩衝後MySql 的緩衝機制對全域的有效,如果你只想對特定的查詢語句使用緩衝,可以通過把 query_cache_type 設定為 “DEMAND” 並且在查詢語句中加入: SQL_CACHE 來進行,比如:SELECT SQL_CACHE DomoloSeoHelper from domolo where author='tianchunfeng' 。
上面為你介紹了 MySQL 查詢緩衝的一些基本特點,那麼如何監控MySQL 查詢緩衝的運行時狀態呢?比如監控查詢快取的命中率,調節查詢快取的記憶體大小等等資料。
可以使用下面的命令:
mysql> show status like ‘Qcache%’;
輸出:
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16766912 |
| Qcache_hits | 3 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 6 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+----------+
具體解釋參考: the MySQL Query Cache documentation。
下一篇為你介紹MySql 查詢快取的調優和應用環境。
參考資料:
http://dev.mysql.com/doc/refman/5.0/en/query-cache.html
http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/
http://www.cyberciti.biz/tips/how-does-query-caching-in-mysql-works-and-how-to-find-find-out-my-mysql-query-cache-is-working-or-not.html