MySQL查詢高速緩衝詳解

來源:互聯網
上載者:User

標籤:

查詢高速緩衝概述

查詢快取儲存SELECT查詢的文本以及發送給用戶端的相應結果。如果隨後收到一個相同的查詢,伺服器從查詢快取中重新得到查詢結果,而不再需要解析和執行查詢。如果你有一個不經常改變的表並且伺服器收到該表的大量相同查詢,查詢快取在這樣的應用環境中十分有用。對於許多Web伺服器來說存在這種典型情況,它根據資料庫內容產生大量的動態網頁面。
備忘1.查詢快取不返回舊的資料。當表更改後(如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE操作),查詢快取值的相關條目被清空。2.如果你有許多mysqld伺服器更新相同的MyISAM表,在這種情況下查詢快取不起作用。3.查詢快取不適用於伺服器方編寫的語句。如果正在使用伺服器方編寫的語句,要考慮到這些語句將不會應用查詢快取.

查詢高速緩衝如何工作

當MySQL伺服器收到一個查詢請求的時候,MySQL伺服器首先檢查使用者對所有相關資料庫和表的SELECT許可權,如許可權通過,然後以該SQL文本作為key來從查詢快取中檢索是否有相同的key(因為資料緩衝都是以SQL文本作為key來儲存的),如果從查詢緩衝中找到對應的key值,就返回一個對應的查詢結果,伺服器把Qcache_hits狀態變數的值加一,而不需要解析器對sql語句進行解析,如果尋找不到對應的key值,然後執行sql的解析,然後查詢,可以參考。

備忘:
1.作為key值的sql語句是區分大小寫,即SELECT * FROM t1select * from t1對應的key值是不一樣的。所以,如果開啟了查詢緩衝,在寫SQL語句的時候,應注意這點。
2.如果一個表被更改了,那麼使用那個表的所有緩衝查詢將不再有效,並且從緩衝區中移出,這樣保證了資料的一致性(即表中資料和緩衝中資料一致性)。

查詢高速緩衝配置

1.查看查詢緩衝是否可以
MySQL中,可以通過have_query_cache伺服器系統變數指示查詢快取是否可用。即使禁用查詢快取,當使用標準 MySQL二進位時,這個值總是YES。

2.其他重要配置參數
查詢快取系統變數名以query_cache_ 開頭,如,我們將逐一說明。

  • having_query_cache
    就不在細說了,主要是控制查詢緩衝的開啟與否。
  • query_cache_limit
    單個查詢可以被緩衝的具體查詢結果的最大值。
  • query_cache_min_res_unit
    該參數是控制儲存查詢緩衝時候,分配的記憶體塊大小。當查詢進行的時候,但如果要儲存的結果比較大,超過query_cache_min_res_unit的值 ,這時候mysql將一邊檢索結果,一邊進行儲存結果,所以,有時候並不是把所有結果全部得到後再進行一次性儲存,而是每次分配一塊 query_cache_min_res_unit 大小的記憶體空間儲存結果集,使用完後,接著再分配一個這樣的塊,如果還不不夠,接著再分配一個塊,依此類推,也就是說,有可能在一次查詢中,mysql要進行多次記憶體配置的操作。query_cache_min_res_unit預設值是4KB。 如果你有大量返回小結果資料的查詢,預設資料區塊大小可能會導致記憶體片段,顯示為大量空閑記憶體塊。由於缺少記憶體,記憶體片段會強制查詢快取從緩衝記憶體中修整(刪除)查詢。這時,你應該減少query_cache_min_res_unit變數的值,空閑塊和由於修整而移出的查詢的數量通過Qcache_free_blocks和Qcache_lowmem_prunes變數的值給出。當然 如果大量查詢返回大結果(檢查 Qcache_total_blocks和Qcache_queries_in_cache狀態變數),你可以通過增加query_cache_min_res_unit變數的值來提高性。
  • query_cache_size
    查詢快取大小,設定為0表示禁用查詢快取。 預設緩衝大小設定為0;也就是禁用查詢快取。當設定query_cache_size變數為非零值時,應記住查詢快取至少大約需要40KB來分配其資料結構。(具體大小取決於系統結構)。如果你把該值設定的太小,將會得到一個警告,且會將query_cache_size值設定為0。

  • query_cache_type
    該參數主要是控制緩衝行為的。query_cache_type變數的GLOBAL值將決定更改後所有串連用戶端的緩衝行為。在linux下,可在my.cnf(在win下,可在my.ini)中進行配置。具體用戶端可以通過設定query_cache_type變數的會話值控制它們本身串連的緩衝行為。例如,一個客戶可以禁用自己的查詢快取。 該參數有三種值如下
    • 0或OFF
      將阻止緩衝或查詢快取結果
    • 1或ON
      將允許緩衝,以SELECT SQL_NO_CACHE開始的查詢語句除外。
    • 2或DEMAND
      僅對以SELECT SQL_CACHE開始的那些查詢語句啟用緩衝
查詢高速緩衝維護片段的清理

在前面,我們可以得知,使用緩衝,不可避免記憶體片段,我們可以使用FLUSH QUERY CACHE語句來清理查詢快取片段,以提高記憶體使用量效能。該語句不從緩衝中移出任何查詢。RESET QUERY CACHE語句從查詢快取中移出所有查詢。FLUSH TABLES語句也執行同樣的工作,區別optimize table tableName,關於optimize可以參考(http://blog.csdn.net/hsd2012/article/details/51485250)。

查詢快取效能監控

為了監視查詢快取效能,使用SHOW STATUS查看緩衝狀態變數:

Qcache_free_blocks:緩衝中相鄰記憶體塊的個數。數目大說明可能有片段。執行FLUSH QUERY CACHE會對緩衝中的片段進行整理,只保留一個空閑塊。
Qcache_free_memory:緩衝中的空閑記憶體。
Qcache_hits:每次查詢在緩衝中命中時就增大
Qcache_inserts:每次插入一個查詢時就增大。叫用次數除以插入次數就是不中比率。
Qcache_lowmem_prunes:緩衝出現記憶體不足,並且必須為了緩衝新的查詢,而從查詢緩衝區中移出到自由記憶體中的查詢的數目。這個數字最好長時間來看;如果這個 數字在不斷增長,就表示可能片段非常嚴重,或者記憶體很少。(上面的 Qcache_free_blocks和Qcache_free_memory可以告訴您屬於哪種情況) 。從查詢緩衝區移除查詢緩衝,使用最近最少使用(LRU)策略。
Qcache_not_cached:不適合進行緩衝的查詢的數量,通常是由於這些查詢不是 SELECT 語句或者用了now()之類的函數。
Qcache_queries_in_cache:當前緩衝的查詢(和響應)的數量。
Qcache_total_blocks:緩衝中塊的數量。
Qcache_total_blocks和Qcache_free_blocks可以顯示查詢快取記憶體片段。

備忘
以上敘述,主要參考mysql手冊。

MySQL查詢高速緩衝詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.