查詢(xún)mysql的緩存優(yōu)化詳解

本文主要給大家介紹查詢(xún)MySQL的緩存優(yōu)化詳解,希望可以給大家補(bǔ)充和更新些知識(shí),如有其它問(wèn)題需要了解的可以持續(xù)在創(chuàng)新互聯(lián)行業(yè)資訊里面關(guān)注我的更新文章的。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),河?xùn)|企業(yè)網(wǎng)站建設(shè),河?xùn)|品牌網(wǎng)站建設(shè),網(wǎng)站定制,河?xùn)|網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,河?xùn)|網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

寫(xiě)在前面:查詢(xún)緩存從MySQL 5.7.20開(kāi)始已被棄用,并在MySQL 8.0中被刪除。
Query cache 作用于整個(gè) MySQL,主要用來(lái)緩存 MySQL 中的查詢(xún)結(jié)果集,也就是一條SQL語(yǔ)句執(zhí)行的結(jié)果集,所以?xún)H僅只能針對(duì)select語(yǔ)句。當(dāng)我們打開(kāi)了 Query Cache 功能,MySQL在接受到一條select語(yǔ)句的請(qǐng)求后,如果命中緩存,也就是說(shuō)所需結(jié)果集已經(jīng)在緩存中了,后面一系列步驟都不用再執(zhí)行,直接從緩存拿到結(jié)果集返回給客戶(hù)端,可以極大的提高查詢(xún)性能!
sql 查詢(xún)數(shù)據(jù)庫(kù) 執(zhí)行步驟如下:
查詢(xún)mysql的緩存優(yōu)化詳解
從上圖可以看出,當(dāng)select 命中緩存后,后面一系列的sql解析,預(yù)處理,優(yōu)化器處理都不用進(jìn)行!

數(shù)據(jù)庫(kù)緩存打開(kāi)方式:
查詢(xún)mysql的緩存優(yōu)化詳解
query_cache_size參數(shù)可以根據(jù)自己數(shù)據(jù)庫(kù)查詢(xún)運(yùn)行狀況進(jìn)行自行調(diào)整,調(diào)整原則稍后介紹!
查詢(xún)mysql的緩存優(yōu)化詳解
query_cache_type可以設(shè)置為0,1或者2(DEMOND),分別表示完全不使用query cache,除顯式要求不使用query cache(使用sql_no_cache)之外的所有的select都使用query cache,只有顯示要求才使用query cache(使用sql_cache)

可以用如下命令show variables like '%have_query_cache%';查看是否開(kāi)啟,其中have_query_cache為是否開(kāi)啟,query_cache_limit 指定單個(gè)查詢(xún)能夠使用的緩沖區(qū)大小,缺省為1M;query_cache_min_res_unit為系統(tǒng)分配的最小緩存塊大小,默認(rèn)是4KB,設(shè)置值大對(duì)大數(shù)據(jù)查詢(xún)有好處,但如果你的查詢(xún)都是小數(shù)據(jù) 查詢(xún),就容易造成內(nèi)存碎片和浪費(fèi);
查詢(xún)mysql的緩存優(yōu)化詳解
通過(guò)以下命令查看緩存相關(guān)變量 show variables like '%query_cache%';
查詢(xún)mysql的緩存優(yōu)化詳解
通過(guò)以下命令查看查詢(xún)緩存狀態(tài) show status like '%Qcache%';
查詢(xún)mysql的緩存優(yōu)化詳解
Qcache_free_blocks:目前還處于空閑狀態(tài)的 Query Cache 中內(nèi)存 Block 數(shù)目
Qcache_free_memory:目前還處于空閑狀態(tài)的 Query Cache 內(nèi)存總量
Qcache_hits:Query Cache 命中次數(shù)
Qcache_inserts:向 Query Cache 中插入新的 Query Cache的次數(shù),也就是沒(méi)有命中的次數(shù)
Qcache_lowmem_prunes:當(dāng) Query Cache 內(nèi)存容量不夠,需要從中刪除老的 Query Cache以給新的 Cache 對(duì)象使用的次數(shù)
Qcache_not_cached:沒(méi)有被 Cache 的 SQL 數(shù),包括無(wú)法被 Cache 的 SQL 以及由于query_cache_type 設(shè)置的不會(huì)被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數(shù)量
Qcache_total_blocks:Query Cache 中總的 Block 數(shù)量
檢查換成命中情況
查詢(xún)緩存命中率的計(jì)算公式是 Qcache_hits/(Qcache_hits+Com_select)。
query_cache_min_res_unit默認(rèn)是4KB,設(shè)置值大對(duì)大數(shù)據(jù)查詢(xún)有好處,但如果你的查詢(xún)都是小數(shù)據(jù)查詢(xún),就容易造成內(nèi)存碎片和浪費(fèi)。

查詢(xún)緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

如果查詢(xún)緩存碎片率超過(guò)20%,可以用FLUSH QUERYCACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢(xún)都是小數(shù)據(jù)量的話(huà)。

查詢(xún)緩存利用率 = (query_cache_size - Qcache_free_memory) /query_cache_size * 100%

查詢(xún)緩存利用率在25%以下的話(huà)說(shuō)明query_cache_size設(shè)置的過(guò)大,可適當(dāng)減小;查詢(xún)緩存利用率在80%以上而且Qcache_lowmem_prunes >50的話(huà)說(shuō)明query_cache_size可能有點(diǎn)小,要不就是碎片太多。

查詢(xún)緩存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%

優(yōu)化提示:
如果Qcache_lowmem_prunes 值比較大,表示查詢(xún)緩存區(qū)大小設(shè)置太小,需要增大。
如果Qcache_free_blocks 較多,表示內(nèi)存碎片較多,需要清理,flush query cache

高性能mysql中關(guān)于query_cache_min_res_unit大小調(diào)優(yōu)給出的計(jì)算公式 query_cache_min_res_unit = (query_cache_size - Qcache_free_memory)/ Qcache_queries_in_cache

mysql在判斷是否命中緩存時(shí),任何字符的不同 ,不確定的函數(shù) 都將導(dǎo)致緩存無(wú)法命中,子查詢(xún),存儲(chǔ)過(guò)程也將導(dǎo)致查詢(xún)緩存無(wú)法命中;
mysql查詢(xún)緩存在帶來(lái)查詢(xún)性能提升的同時(shí),也會(huì)帶來(lái)其他的一些問(wèn)題:首先、打開(kāi)查詢(xún)緩存,對(duì)讀對(duì)寫(xiě)都會(huì)帶來(lái)額外的消耗
1)首先在讀查詢(xún)之前,必須先去檢查是否命中緩存
2)如果命中緩存,那么直接返回結(jié)果集給用戶(hù),不在執(zhí)行后續(xù)一系列操作,如果沒(méi)有命中緩存,那么在查詢(xún)完成后,還需要將結(jié)果集存入查詢(xún)緩存,這本身也是一個(gè)消耗
3)對(duì)寫(xiě)操作也有很大影響,因?yàn)槲覀冊(cè)趯?duì)表進(jìn)行時(shí),也需要先將該表的查詢(xún)緩存設(shè)置為失效,如果這個(gè)表的緩存很大,那么這也是一個(gè)相當(dāng)大的消耗。
對(duì)查詢(xún)緩存的寫(xiě)和設(shè)置失效操作都是一個(gè)排他鎖操作
1)對(duì)于innodb 來(lái)說(shuō),事務(wù)特性會(huì)限制查詢(xún)的使用,事務(wù)中修改了某個(gè)表,那么,需要將這個(gè)表的查詢(xún)緩存設(shè)置為失效,RR,RC 模式下,事物特性會(huì)隔離這個(gè)修改對(duì)其他事務(wù)不可見(jiàn)!在這個(gè)事務(wù)提交前,這個(gè)表的其他相關(guān)查詢(xún)都是無(wú)法緩存的,只有在這個(gè)表修改事物提交后,這個(gè)表的相關(guān)查詢(xún)才可以緩存,因此,長(zhǎng)時(shí)間的大的更新事務(wù)將導(dǎo)致查詢(xún)緩存效率大大下降!
2)如果我們開(kāi)啟了一個(gè)很大的查詢(xún)緩存,在緩存失效操作時(shí),可能導(dǎo)致整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)都出現(xiàn)性能問(wèn)題,因?yàn)榫彺媸Р僮魇且粋€(gè)全局鎖,其他
所有需要做緩存失效操作的查詢(xún)都要等待這個(gè)鎖,而且無(wú)論緩存命中檢測(cè),還是緩存失效檢測(cè)都需要等待這個(gè)鎖。緩存過(guò)大時(shí),這將導(dǎo)致嚴(yán)重的性能瓶頸。
因此我們?cè)陂_(kāi)啟查詢(xún)緩存時(shí),一定是根據(jù)業(yè)務(wù)需要,開(kāi)啟一個(gè)大小比較合理的查詢(xún)緩存,在線(xiàn)上避免大的事務(wù)!

看了以上關(guān)于查詢(xún)mysql的緩存優(yōu)化詳解,希望能給大家在實(shí)際運(yùn)用中帶來(lái)一定的幫助。本文由于篇幅有限,難免會(huì)有不足和需要補(bǔ)充的地方,如有需要更加專(zhuān)業(yè)的解答,可在官網(wǎng)聯(lián)系我們的24小時(shí)售前售后,隨時(shí)幫您解答問(wèn)題的。

 

 

當(dāng)前名稱(chēng):查詢(xún)mysql的緩存優(yōu)化詳解
文章URL:http://muchs.cn/article30/ijodso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站做網(wǎng)站、定制網(wǎng)站、響應(yīng)式網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名