MySQL 查詢緩衝
查詢快取的作用就是當查詢接收到一個和之前同樣的查詢,伺服器將會從查詢快取種檢索結果,而不是再次分析和執行上次的查詢。這樣就大大提高了效能,節省時間。
1.配置查詢快取
修改設定檔,修改[mysqld]下的query_cache_size和query_cache_type(如果沒有則添加)。其中query_cache_size表示緩衝的大小,而query_cache_type有3個值,表示緩衝那種類 型的select結果集,query_cache_type各個值如下:
0或off關閉緩衝
1或on開啟緩衝,但是不儲存使用sql_no_cache的select語句,如不緩衝select sql_no_cache name from wei where id=2
2或demand開啟有條件緩衝,只緩衝帶sql_cache的select語句,緩衝select sql_cache name from wei where id=4
例子的配置為下,配置完成重啟Mysql伺服器即可。
query_cache_size=10M query_cache_type=1
可以用如下命令查看是否開啟,其中have_query_cache為是否開啟,query_cache_limit 指定單個查詢能夠使用的緩衝區大小,預設為1M;query_cache_min_res_unit為系統分配的最小緩衝塊大小,預設是4KB,設定值大對大資料查詢有好處,但如果你的查詢都是小資料 查詢,就容易造成記憶體片段和浪費;query_cache_size和query_cache_type就是上面我們的配置;query_cache_wlock_invalidate表示當有其他用戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中,是否返回cache結果還是等寫操作完成再讀表擷取結果。
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 | 10485760 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+ 6 rows in set (0.00 sec)
2.測試
我們先執行一次,select count(*) from wei ;然後再執行一次,可以看出第二次用的時間遠遠低於第一次的執行,因為第二次從緩衝中讀取了select結果。
mysql> select count(*) from wei ; +----------+ | count(*) | +----------+ | 4194304 | +----------+ 1 row in set (3.92 sec) mysql> select count(*) from wei ; +----------+ | count(*) | +----------+ | 4194304 | +----------+ 1 row in set (0.00 sec)
我們可以通過如下命令查看現在緩衝的情況
mysql> show status like 'qcache%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 10475424 | | Qcache_hits | 1 | | Qcache_inserts | 1 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 0 | | Qcache_queries_in_cache | 1 | | Qcache_total_blocks | 4 | +-------------------------+----------+ 8 rows in set (0.00 sec)
其中各個參數的意義如下:
- Qcache_free_blocks:緩衝中相鄰記憶體塊的個數。數目大說明可能有片段。FLUSH QUERY CACHE會對緩衝中的片段進行整理,從而得到一個空閑塊。
- Qcache_free_memory:緩衝中的空閑記憶體。
- Qcache_hits:每次查詢在緩衝中命中時就增大
- Qcache_inserts:每次插入一個查詢時就增大。叫用次數除以插入次數就是不中比率。
- Qcache_lowmem_prunes:緩衝出現記憶體不足並且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個 數字在不斷增長,就表示可能片段非常嚴重,或者記憶體很少。(上面的 free_blocks和free_memory可以告訴您屬於哪種情況)
- Qcache_not_cached:不適合進行緩衝的查詢的數量,通常是由於這些查詢不是 SELECT 語句或者用了now()之類的函數。
- Qcache_queries_in_cache:當前緩衝的查詢(和響應)的數量。
- Qcache_total_blocks:緩衝中塊的數量。
清除緩衝
mysql的FLUSH句法(清除緩衝)
FLUSH flush_option [,flush_option]
如果你想要清除一些MySQL使用內部緩衝,你應該使用FLUSH命令。為了執行FLUSH,你必須有reload許可權。
flush_option可以是下列任何東西:
- HOSTS 這個用的最多,經常碰見。主要是用來清空主機緩衝表。如果你的某些主機改變IP數字,或如果你得到錯誤訊息Host ... isblocked,你應該清空主機表。當在串連MySQL伺服器時,對一台給定的主機有多於 max_connect_errors個錯誤連續不斷地發生,MySQL為了安全的需要將會阻止該主機進一步的串連請求。清空主機表允許主機再嘗試串連。
- LOGS 關閉當前的二進位記錄檔並建立一個新檔案,新的二進位記錄檔的名字在當前的二進位檔案的編號上加1。
- PRIVILEGES 這個也是經常使用的,每當重新賦權後,為了以防萬一,讓新許可權立即生效,一般都執行一把,目地是從資料庫授權表中重新裝載許可權到緩衝中。
- TABLES 關閉所有開啟的表,同時該操作將會清空查詢快取中的內容。
- FLUSH TABLES WITH READ LOCK 關閉所有開啟的表,同時對於所有資料庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操作常常用於資料備份的時候。
- STATUS 重設大多數狀態變數到0。
- MASTER 刪除所有的二進位日誌索引檔案中的二進位記錄檔,重設二進位記錄檔的索引檔案為空白,建立一個新的二進位記錄檔,不過這個已經不推薦使用,改成reset master 了。可以想象,以前自己是多土啊,本來一條簡單的命令就可以搞定的,卻要好幾條命令來,以前的做法是先查出來當前的二進位記錄檔名,再用purge 操作。
- QUERY CACHE 重整查詢快取,消除其中的片段,提高效能,但是並不影響查詢快取中現有的資料,這點和Flush table 和Reset Query Cache(將會清空查詢快取的內容)不一樣的。
- SLAVE 類似於重設複製吧,讓從資料庫忘記主要資料庫的複製位置,同時也會刪除已經下載下來的relay log,與Master一樣,已經不推薦使用,改成Reset Slave了。這個也很有用的。
一般來講,Flush操作都會記錄在二進位記錄檔中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不會記錄,因此上述操作如果記錄在二進位記錄檔中話,會對從資料庫造成影響。注意:Reset操作其實扮演的是一個Flush操作的增強版的角色。