成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL QueryCache原理經典講解

數據庫 MySQL
以下的文章主要描述的是MySQL QueryCache原理講述,以下的文章主要是對MySQL QueryCache原理的詳細解析,以下就是文章的具體內容描述。

我們大家都知道MySQL QueryCache(下面簡稱QC)它是根據實際應用的SQL語句來cache 的。一個相關的SQL查詢,如果它是以select開頭的話,其MySQL服務器就會嘗試對其使用 QC。每個Cache都是以SQL文本作為key來存的。

在應用QC之前,SQL文本不會被作任何處理。

也就是說,兩個SQL語句,只要相差哪怕是一個字 符(例如大小寫不一樣;多一個空格等),那么這兩個SQL將使用不同的一個CACHE。不過SQL文本有可能會被客戶端做一些處理。例如在官方的命令行客 戶端里,在發送SQL給服務器之前,會做如下處理:

 

1、過濾所有注釋。

 

2、去掉SQL文本前后的空格,TAB等字符。注意,是文本前面和后面的。中間的不會被去掉。

 

下面的三條SQL里,因為SELECT大小寫的關系,最后一條和其他兩條在QC里肯定是用的不一樣的存儲位置。而第一條和第二條,區別在于后者有個 注釋,在不同客戶端,會有不一樣的結果。所以,保險起見,請盡量不要使用動態的注釋。在PHP的mysql擴展里,SQL的注釋是不會被去掉的。也就是三 條SQL會被存儲在三個不同的緩存里,雖然它們的結果都是一樣的。

 

  1. select * FROM people where name=’surfchen’;  
  2. select * FROM people where /*hey~*/name=’surfchen’;  
  3. SELECT * FROM people where name=’surfchen’; 

 

 

目前只有select語句會被cache,其他類似show,use的語句則不會被cache。

 

因為QC是如此前端,如此簡單的一個緩存系統,所以如果一個表被更新,那么和這個表相關的SQL的所有QC都會被失效。假設一個聯合查詢里涉及到了表A和表B,如果表A或者表B的其中一個被更新(update或者delete),這個查詢的QC將會失效。

也就是說,如果一個表被頻繁更新,那么就要考慮清楚究竟是否應該對相關的一些SQL進行QC了。一個被頻繁更新的表如果被應用了QC,可能會加重數 據庫的負擔,而不是減輕負擔。一般的做法是默認打開QC,而對一些涉及頻繁更新的表的SQL語句加上SQL_NO_CACHE關鍵詞來對其禁用 CACHE。這樣可以盡可能避免不必要的內存操作,盡可能保持內存的連續性。

那些查詢很分散的SQL語句,也不應該使用QC。例如用來查詢用戶和密碼的語句——“select pass from user where name=’surfchen’”。這樣的語句,在一個系統里,很有可能只在一個用戶登陸的時候被使用。每個用戶的登陸所用到的查詢,都是不一樣的SQL 文本,QC在這里就幾乎不起作用了,因為緩存的數據幾乎是不會被用到的,它們只會在內存里占地方。

存儲塊

在本節里“存儲塊”和“block”是同一個意思。QC緩存一個查詢結果的時候,一般情況下不是一次性地分配足夠多的內存來緩存結果的。而是在查詢 結果獲得的過程中,逐塊存儲。當一個存儲塊被填滿之后,一個新的存儲塊將會被創建,并分配內存(allocate)。

單個存儲塊的內存分配大小通過 query_cache_min_res_unit參數控制,默認為4KB。最后一個存儲塊,如果不能被全部利用,那么沒使用的內存將會被釋放。如果被緩 存的結果很大,那么會可能會導致分配內存操作太頻繁,系統系能也隨之下降;而如果被緩存的結果都很小,那么可能會導致內存碎片過多,這些碎片如果太小,就 很有可能不能再被分配使用。

除了查詢結果需要存儲塊之外,每個SQL文本也需要一個存儲塊,而涉及到的表也需要一個存儲塊(表的存儲塊是所有線程共享的,每個表只需要一個存儲 塊)。存儲塊總數量=查詢結果數量*2+涉及的數據庫表數量。

也就是說,第一個緩存生成的時候,至少需要三個存儲塊:表信息存儲塊,SQL文本存儲塊,查 詢結果存儲塊。而第二個查詢如果用的是同一個表,那么最少只需要兩個存儲塊:SQL文本存儲塊,查詢結果存儲塊。

通過觀察Qcache_queries_in_cache和Qcache_total_blocks可以知道平均每個緩存結果占用的存儲塊。它們的 比例如果接近1:2,則說明當前的query_cache_min_res_unit參數已經足夠大了。如果Qcache_total_blocks比 Qcache_queries_in_cache多很多,則需要增加query_cache_min_res_unit的大小。

Qcache_queries_in_cache*query_cache_min_res_unit(sql文本和表信息所在的block占用的 內存很小,可以忽略)如果遠遠大于query_cache_size-Qcache_free_memory,那么可以嘗試減小 query_cache_min_res_unit的值。

關于MySQL QueryCache原理 :調整大小

如果Qcache_lowmem_prunes增長迅速,意味著很多緩存因為內存不夠而被釋放,而不是因為相關表被更新。嘗試加大query_cache_size,盡量使Qcache_lowmem_prunes零增長。

啟動參數

show variables like ‘query_cache%’可以看到這些信息。

query_cache_limit:如果單個查詢結果大于這個值,則不Cache

query_cache_size:分配給QC的內存。如果設為0,則相當于禁用QC。要注意QC必須使用大約40KB來存儲它的結構,如果設定小于 40K

 

【編輯推薦】

  1. Oracle多表創建的視圖insert的解決方法
  2. 闡述Oracle decode函數的用法
  3. 實現Oracle跨服務器的具體步驟
  4. Oracle釋放undo表空間的實際操作步驟
  5. 實現Oracle 客戶端配置的具體步驟
責任編輯:佚名 來源: 博客園
相關推薦

2010-05-27 17:17:37

Subversion入

2009-11-09 09:23:10

WCF數據契約

2009-09-17 18:27:40

CLR是什么

2010-03-03 14:05:36

Python實例應用

2009-09-18 10:40:05

CLR存儲過程

2009-09-11 09:15:32

C# get set

2010-06-02 13:37:28

Linux IPv6配

2021-05-31 07:01:46

限流算法令牌

2009-07-07 16:20:31

JSP試題

2009-07-06 16:16:33

Servlet容器工作

2009-06-08 16:52:00

2010-09-27 12:51:05

DHCP工作原理

2019-07-24 11:30:54

程序員技能開發者

2009-11-10 11:01:15

無線路由器設置

2009-11-19 15:01:58

2024-02-28 09:22:03

限流算法數量

2019-10-24 11:10:06

Kubernetes網絡運維

2009-10-27 09:30:53

VB.NET DLL搜

2018-12-25 08:00:00

2009-11-30 14:08:42

PHP字符串原理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线成人 | 成人午夜影院 | 成人一区二区三区 | 亚洲欧美国产精品一区二区 | 色综合九九 | 亚洲精品视频在线播放 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 黄色成人av | 国产91久久精品一区二区 | 成人在线视频免费播放 | 日韩在线免费视频 | 在线午夜 | 久久精品亚洲成在人线av网址 | 91成人精品视频 | 亚洲 欧美 另类 日韩 | 国产精品一区二区在线 | 国产一二三区电影 | 色综合久久天天综合网 | 日本午夜免费福利视频 | 亚洲精品美女视频 | 毛片a级毛片免费播放100 | 95国产精品| 波多野结衣亚洲 | 精品成人在线 | 日韩成人免费视频 | 国产一区二区三区在线视频 | 中文字幕精品一区二区三区精品 | 日韩欧美一级精品久久 | www.日韩高清 | 国产特级毛片 | 人人人干| 成年人国产在线观看 | 国产成人精品久久 | 久久综合伊人 | 国产分类视频 | 亚洲成人黄色 | 999免费视频 | 欧美日韩在线一区二区 | 99精品国产一区二区三区 | 国产精品成人久久久久 | 中文字幕第三页 |