增加線程緩存大小
連接管理器線程處理伺服器監聽的網路介面上的客戶端連接請求。連接管理器線程將每個客戶端連接與專用於它的線程關聯,該線程負責處理該連接的身份驗證和所有請求處理。因此,線程和當前連接的客戶端之間是一對一的比例。確保線程緩存足夠大以容納所有傳入請求是非常重要的。
MySQL提供了許多與連接線程相關的伺服器變數:
線程緩存大小由thread_cache_size系統變數決定。默認值為0(無緩存),這將導致為每個新連接設置一個線程,並在連接終止時需要處理該線程。如果希望伺服器每秒接收數百個連接請求,那麼應該將thread_cache_size設置的足夠高,以便大多數新連接可以使用緩存線程。可以在伺服器啟動或運行時設置max_connections的值。
還應該監視緩存中的線程數(Threads_cached)以及創建了多少個線程,因為無法從緩存中獲取線程(Threads_created)。關於後者,如果Threads_created繼續以每分鍾多於幾個線程的增加,請考慮增加thread_cache_size的值。
使用MySQL show status命令顯示MySQL的變數和狀態信息。這里有幾個例子:
Monyog線程緩存監測
Monyog提供了一個監控線程緩存的屏幕,名為「線程」。與MySQL線程相關的伺服器變數映射到以下Monyog指標:
Monyog線程屏幕還包括「線程緩存命中率」指標。這是一個提示線程緩存命中率的指標。如果值較低,則應該考慮增加線程緩存。在狀態欄以百分比形式顯示該值;它的值越接近100%越好。
如果這些指標的值等於或超過指定值,則可以將每一個指標配置為發出警告和/或嚴重警報
㈡ 高速緩存命中率和內存命中率 詳細解釋一下
這兩個是同個概念,指的是CPU調用指令時命中率的問題。指令是線性傳送給CPU的,還沒有處理到的指令就會暫存在CPU的高速緩存或內存中,當緩存或內存容量不足時,CPU常常會找不到所需的指令,從而被迫到慢悠悠的硬碟中去尋找,間接影響了執行效率。所以大緩存的CPU或增加主機內存容量是提升系統效率的有效方法
㈢ MySQL緩存
mysql 開啟查詢緩存可以有兩種方法來開啟一種是使用set命令來進行開啟,另一種是直接修改my.ini文件來直接設置都是非常的簡單的哦。
開啟緩存,設置緩存大小,具體實施如下:
windows下是my.ini,linux下是my.cnf;
在配置文件的最後追加上:
需要重啟mysql生效;
b) 開啟緩存,兩種方式:
a)使用mysql命令:
如果報錯:
Query cache is disabled; restart the server with query_cache_type=1 to enable it,還是老老實實的該配置文件,然後重啟吧,原因如下:
查看是否設置成功
show variables like "%query_cache%" 查看是否設置成功:
當然如果你的數據表有更新怎麼辦,沒關系mysql默認會和這個表有關系的緩存刪掉,下次查詢的時候會直接讀表然後再緩存
下面是一個簡單的例子:
以上的相關內容就是對mysql緩存查詢和設置的介紹,望你能有所收獲。
一般,我們會把 query_cache_type 設置為 ON,默認情況下應該是ON
query_cache_type有3個值 0代表關閉查詢緩存OFF,1代表開啟ON,2(DEMAND)代表當sql語句中有SQL_CACHE關鍵詞時才緩存,如:
這樣 當我們執行 select id,name from tableName; 這樣就會用到查詢緩存。
①在 query_cache_type 打開的情況下,如果你不想使用緩存,需要指明
select sql_no_cache id,name from tableName;
②當sql中用到mysql函數,也不會緩存
當然也可以禁用查詢緩存: mysql> set session query_cache_type=off;
上面的顯示,表示設置查詢緩存是可用的。
表示查詢緩存大小,也就是分配內存大小給查詢緩存,如果你分配大小為0,
那麼 第一步 和 第二步 起不到作用,還是沒有任何效果。
上面是 mysql6.0設置默認的,之前的版本好像默認是0的,那麼就要自己設置下。
設置
這里是設置1M左右,900多K。
再次查看下:
顯示我們設置新的大小,表示設置成功。
例如: 如果查詢結果很大, 也緩存????這個明顯是不可能的。
MySql 可以設置一個最大的緩存值,當你查詢緩存數結果數據超過這個值就不會
進行緩存。預設為1M,也就是超過了1M查詢結果就不會緩存。
這個是默認的數值,如果需要修改,就像設置緩存大小一樣設置,使用set
重新指定大小。
好了,通過4個步驟就可以 打開了查詢緩存,具體值的大小和查詢的方式 這個因不同
的情況來指定了。
mysql查詢緩存相關變數
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 數量
檢查是否從查詢緩存中受益的最簡單的辦法就是檢查緩存命中率
當伺服器收到SELECT 語句的時候,Qcache_hits 和Com_select 這兩個變數會根據查詢緩存
的情況進行遞增
查詢緩存命中率的計算公式是:Qcache_hits/(Qcache_hits + Com_select)。
query_cache_min_res_unit的配置是一柄」雙刃劍」,默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據 查詢,就容易造成內存碎片和浪費。
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數據量的話。
查詢緩存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%以下的話說明query_cache_size設置的過大,可適當減小;查詢緩存利用率在80%以上而且 Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多。
查詢緩存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%
示例伺服器 查詢緩存碎片率 = 20.46%,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。
查詢緩存可以看做是SQL文本和查詢結果的映射。如果第二次查詢的SQL和第一次查詢的SQL完全相同(注意必須是完全相同,即使多一個空格或者大小寫不同都認為不同)且開啟了查詢緩存,那麼第二次查詢就直接從查詢緩存中取結果,可以通過下面的SQL來查看緩存命中次數(是個累加值):
另外即使完全相同的SQL,如果使用不同的字元集、不同的協議等也會被認為是不同的查詢而分別進行緩存。
在表的結構或數據發生改變時,查詢緩存中的數據不再有效。有這些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會導致緩存數據失效。所以查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。
可以使用下面三個SQL來清理查詢緩存:
1、FLUSH QUERY CACHE; // 清理查詢緩存內存碎片。
2、RESET QUERY CACHE; // 從查詢緩存中移出所有查詢。
3、FLUSH TABLES; //關閉所有打開的表,同時該操作將會清空查詢緩存中的內容。
Query Cache是MySQL Server層的一個非常好的特性,對於小數據集或訪問量非常集中的應用場景,有非常好的性能提升,但是Query Cache引入了一些新的問題,而且大部分場景下比較雞肋,官方打算棄用了
參考:
https://www.cnblogs.com/wangzhuxing/p/5223881.html
https://www.cnblogs.com/lixiuran/archive/2014/03/08/3588654.html
㈣ 什麼叫做cache的寫命中和寫未命中,有什麼區別可以通俗解釋嗎
1、cache的寫命中和寫未命中,就是磁碟或者內存上的存儲區域之前有沒有寫過數據。
如果有,這次再寫到相同的區域叫寫命中;
如果寫到其他區域,叫寫未命中。
2、在數據恢復方面,如果寫命中了,那之前的數據被覆蓋,就很難再恢復回來;
如果寫未命中,那麼之前的數據就容易被找回。
(4)緩存命中率模擬圖擴展閱讀:
緩存命中率
終端用戶訪問加速節點時,如果該節點有緩存住了要被訪問的數據時就叫做命中,如果沒有的話需要回原伺服器取,就是沒有命中。取數據的過程與用戶訪問是同步進行的,所以即使是重新取的新數據,用戶也不會感覺到有延時。 命中率=命中數/(命中數+沒有命中數), 緩存命中率是判斷加速效果好壞的重要因素之一。
應用場景
是OLTP還是OLAP應用,即使是OLTP,也要看訪問的頻度,一個極少被訪問到的緩存等於沒有什麼效果。一般來說,互聯網網站是非常適合緩存應用的場景。
緩存的粒度
毫無疑問,緩存的粒度越小,命中率就越高,對象緩存是目前緩存粒度最小的,因此被命中的幾率更高。
舉個例子來說吧:你訪問當前這個頁面,瀏覽帖子,那麼對於ORM來說,需要發送n條SQL,取各自帖子user的對象。很顯然,如果這個user在其他帖子裡面也跟貼了,那麼在訪問那個帖子的時候,就可以直接從緩存裡面取這個user對象了。
緩存的容量
緩存太小,造成頻繁的LRU,也會降低命中率,緩存的有效期太短也會造成緩存命中率下降。
所以緩存命中率問題不能一概而論,一定說命中率很低或者命中率很高。但是如果你對於緩存的掌握很精通,有意識的去調整應用的架構,去分解緩存的粒度,總是會帶來很高的命中率的。
㈤ 我想問下緩存的命中率是什麼意思求答案
命中率=從緩存中讀取數據的次數/所有訪問數據次數(磁碟讀取次數+緩存讀取次數)
命中率定義理解為:
命中率=命中數/(命中數+沒有命中數)
終端用戶訪問伺服器時,如果該伺服器有緩存住了要被訪問的數據時就叫做命中,如果沒有的話需要回原伺服器取,就是沒有命中。取數據的過程與用戶訪問是同步進行的,所以即使是重新取的新數據,用戶也不會感覺到有延時
當客戶機訪問相同的游戲數據時,這時候游戲緩存才起到作用,一般緩存會把最近訪問比較多的游戲資源加到緩存中去,網吧客戶機訪問的游戲數據如果都是同一個游戲這時候命中率才會越高要達到100%是理想情況下,一般能達到70%-90%都算不錯了。
㈥ 什麼叫緩存命中率
其中很多人談到了緩存命中率的問題,應用緩存的命中率取決於很多的因素:
1、應用場景
是OLTP還是OLAP應用,即使是OLTP,也要看訪問的頻度,一個極少被訪問到的緩存等於沒有什麼效果。一般來說,互聯網網站是非常適合緩存應用的場景。
2、緩存的粒度
毫無疑問,緩存的粒度越小,命中率就越高,對象緩存是目前緩存粒度最小的,因此被命中的幾率更高。舉個例子來說吧:你訪問當前這個頁面,瀏覽帖子,那麼對於ORM來說,需要發送n條SQL,取各自帖子user的對象。很顯然,如果這個user在其他帖子裡面也跟貼了,那麼在訪問那個帖子的時候,就可以直接從緩存裡面取這個user對象了。
3、架構的設計
架構的設計對於緩存命中率也有至關重要的影響。例如你應該如何去盡量避免緩存失效的問題,如何盡量提供頻繁訪問數據的緩存問題,這些都是考驗架構師水平的地方。再舉個例子來說,對於論壇,需要記錄每個topic的瀏覽次數,所以每次有人訪問這個topic,那麼topic表就要update一次,這意味著什麼呢?對於topic的對象緩存是無效的,每次訪問都要更新緩存。那麼可以想一些辦法,例如增加一個中間變數記錄點擊次數,每累計一定的點擊,才更新一次資料庫,從而減低緩存失效的頻率。
4、緩存的容量和緩存的有效期
緩存太小,造成頻繁的LRU,也會降低命中率,緩存的有效期太短也會造成緩存命中率下降。
所以緩存命中率問題不能一概而論,一定說命中率很低或者命中率很高。但是如果你對於緩存的掌握很精通,有意識的去調整應用的架構,去分解緩存的粒度,總是會帶來很高的命中率的。
這里我可以舉一個實際的案例,JavaEye2.0網站在使用對象緩存之前,通過MySQL的監控工具進行觀察,在連續24小時的平均每秒發送SQL條數超過了200條,在使用對象緩存之後,連續24小時的平均每秒發送SQL條數下降到了120條左右,幾乎下降了一半。
考慮到很多SQL都是分頁語句,關聯查詢,條件查詢,集合操作,都是不能被緩存的SQL,而真正能夠被緩存的SQL只有根據主鍵查詢對象和對象關聯對象的查詢。所以真正能夠被緩存的SQL估計最多佔所有SQL的60%。所以換算下來,應用緩存的命中率之高,已經相當驚人了。
不過這里要提醒的一點,有將近一半的SQL都被緩存,不意味著性能可以提升一倍。這是因為能夠被緩存的都是按照主鍵查詢單條記錄的SQL,這些SQL本身即使發送到資料庫,對資料庫造成的壓力也沒有想像的那麼大。真正對資料庫造成龐大壓力的正是那些沒有索引的大表查詢,和造成了全表掃描的關聯查詢,這些一旦涉及到全表掃描的查詢,才是性能的真正殺手。當然了,不管怎麼說,通過使用對象緩存,是毫無疑問可以大幅度降低資料庫的負載壓力的,有效提升web應用的性能的。
關於這一點,我再給出一組數據來加深大家的印象,通過使用操作系統網路工具進行統計:
JavaEye網站web server的埠每秒數據流量是2MB;
JavaEye網站的MySQL資料庫埠的每秒數據流量是1.2MB;
而網站的memcached的埠每秒的數據流量高達5MB