MySQL復制線程長時間Opening tables

最近經常有人問我 MySQL Query Cache 相關的問題,就整理一點 MySQL Query Cache 的內容,以供參考。

顧名思義,MySQL Query Cache 就是用來緩存和 Query 相關的數據的。具體來說,Query Cache 緩存了我們客戶端提交給 MySQL 的 SELECT 語句以及該語句的結果集。大概來講,就是將 SELECT 語句和語句的結果做了一個 HASH 映射關系然后保存在一定的內存區域中。

在大部分的 MySQL 分發版本中,Query Cache 功能默認都是打開的,我們可以通過調整 MySQL Server 的參數選項打開該功能。主要由以下5個參數構成:

query_cache_limit:允許 Cache 的單條 Query 結果集的最大容量,默認是1MB,超過此參數設置的 Query 結果集將不會被 Cache

query_cache_min_res_unit:設置 Query Cache 中每次分配內存的最小空間大小,也就是每個 Query 的 Cache 最小占用的內存空間大小

query_cache_size:設置 Query Cache 所使用的內存大小,默認值為0,大小必須是1024的整數倍,如果不是整數倍,MySQL 會自動調整降低最小量以達到1024的倍數

query_cache_type:控制 Query Cache 功能的開關,可以設置為0(OFF),1(ON)和2(DEMAND)三種,意義分別如下:

0(OFF):關閉 Query Cache 功能,任何情況下都不會使用 Query Cache

1(ON):開啟 Query Cache 功能,但是當 SELECT 語句中使用的 SQL_NO_CACHE 提示后,將不使用Query Cache

2(DEMAND):開啟 Query Cache 功能,但是只有當 SELECT 語句中使用了 SQL_CACHE 提示后,才使用 Query Cache

query_cache_wlock_invalidate:控制當有寫鎖定發生在表上的時刻是否先失效該表相關的 Query Cache,如果設置為 1(TRUE),則在寫鎖定的同時將失效該表相關的所有 Query Cache,如果設置為0(FALSE)則在鎖定時刻仍然允許讀取該表相關的 Query Cache。

Query Cache 如何處理子查詢的?

這是我遇到的最為常見的一個問題。其實 Query Cache 是以客戶端請求提交的 Query 為對象來處理的,只要客戶端請求的是一個 Query,無論這個 Query 是一個簡單的單表查詢還是多表 Join,亦或者是帶有子查詢的復雜 SQL,都被當作成一個 Query,不會被分拆成多個 Query 來進行 Cache。所以,存在子查詢的復雜 Query 也只會產生一個Cache對象,子查詢不會產生單獨的Cache內容。UNION[ALL] 類型的語句也同樣如此。

Query Cache 是以 block 的方式存儲的數據塊嗎?

不是,Query Cache 中緩存的內容僅僅只包含該 Query 所需要的結果數據,是結果集。當然,并不僅僅只是結果數據,還包含與該結果相關的其他信息,比如產生該 Cache 的客戶端連接的字符集,數據的字符集,客戶端連接的 Default Database等。

Query Cache 為什么效率會非常高,即使所有數據都可以 Cache 進內存的情況下,有些時候也不如使用 Query Cache 的效率高?

Query Cache 的查找,是在 MySQL 接受到客戶端請求后在對 Query 進行權限驗證之后,SQL 解析之前。也就是說,當 MySQL 接受到客戶端的SQL后,僅僅只需要對其進行相應的權限驗證后就會通過 Query Cache 來查找結果,甚至都不需要經過 Optimizer 模塊進行執行計劃的分析優化,更不許要發生任何存儲引擎的交互,減少了大量的磁盤 IO 和 CPU 運算,所以效率非常高。

客戶端提交的 SQL 語句大小寫對 Query Cache 有影響嗎?

有,由于 Query Cache 在內存中是以 HASH 結構來進行映射,HASH 算法基礎就是組成 SQL 語句的字符,所以必須要整個 SQL 語句在字符級別完全一致,才能在 Query Cache 中命中,即使多一個空格也不行。

一個 SQL 語句在 Query Cache 中的內容,在什么情況下會失效?

為了保證 Query Cache 中的內容與是實際數據絕對一致,當表中的數據有任何變化,包括新增,修改,刪除等,都會使所有引用到該表的 SQL 的 Query Cache 失效。

為什么我的系統在開啟了 Query Cache 之后整體性能反而下降了?

當開啟了 Query Cache 之后,尤其是當我們的 query_cache_type 參數設置為 1 以后,MySQL 會對每個 SELECT 語句都進行 Query Cache 查找,查找操作雖然比較簡單,但仍然也是要消耗一些 CPU 運算資源的。而由于 Query Cache 的失效機制的特性,可能由于表上的數據變化比較頻繁,大量的 Query Cache 頻繁的被失效,所以 Query Cache 的命中率就可能比較低下。所以有些場景下,Query Cache 不僅不能提高效率,反而可能造成負面影響。

如何確認一個系統的 Query Cache 的運行是否健康,命中率如何,設置量是否足夠?

MySQL 提供了一系列的 Global Status 來記錄 Query Cache 的當前狀態,具體如下:

Qcache_free_blocks:目前還處于空閑狀態的 Query Cache 中內存 Block 數目

Qcache_free_memory:目前還處于空閑狀態的 Query Cache 內存總量

Qcache_hits:Query Cache 命中次數

Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數,也就是沒有命中的次數

Qcache_lowmem_prunes:當 Query Cache 內存容量不夠,需要從中刪除老的 Query Cache 以給新的 Cache 對象使用的次數

Qcache_not_cached:沒有被 Cache 的 SQL 數,包括無法被 Cache 的 SQL 以及由于 query_cache_type 設置的不會被 Cache 的 SQL

Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數量

Qcache_total_blocks:Query Cache 中總的 Block 數量

可以根據這幾個狀態計算出 Cache 命中率,計算出 Query Cache 大小設置是否足夠,總的來說,我個人不建議將 Query Cache 的大小設置超過256MB,這也是業界比較常用的做法。

MySQL Cluster 是否可以使用 Query Cache?

其實在我們的生產環境中也沒有使用 MySQL Cluster,所以我也沒有在 MySQL Cluster 環境中使用 Query Cache 的實際經驗,只是 MySQL 文檔中說明確實可以在 MySQL Cluster 中使用 Query Cache。從 MySQL Cluster 的原理來分析,也覺得應該可以使用,畢竟 SQL 節點和數據節點比較獨立,各司其職,只是 Cache 的失效機制會要稍微復雜一點。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容