這篇文章將為大家詳細(xì)講解有關(guān)MySQL數(shù)據(jù)庫查詢緩存原理詳解,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
公司主營業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出秭歸免費做網(wǎng)站回饋大家。
mysql數(shù)據(jù)庫查詢緩存原理是:1、緩存SELECT操作的結(jié)果集和SQL語句,key為sql,value為查詢結(jié)果集;2、如果新的SELECT語句到了,以這個sql為key去緩存中查詢,如果匹配,就把緩存的結(jié)果集返回。
mysql數(shù)據(jù)庫查詢緩存原理是:
概述
查詢緩存(Query Cache,簡稱QC),存儲SELECT語句及其產(chǎn)生的數(shù)據(jù)結(jié)果。閑來無事,做一下這塊的總結(jié),也做個備忘!
超詳細(xì)的mysql數(shù)據(jù)庫查詢緩存總結(jié),值得收藏
工作原理
緩存SELECT操作的結(jié)果集和SQL語句,key為sql,value為查詢結(jié)果集;
如果新的SELECT語句到了,以這個sql為key去緩存中查詢,如果匹配,就把緩存的結(jié)果集返回;
匹配標(biāo)準(zhǔn):與緩存的SQL語句是否完全一樣,sql中字母區(qū)分大小寫以及中間的空格,簡單理解為存儲了一個key-value結(jié)構(gòu),key為sql,value為sql查詢結(jié)果,匹配時使用Java的String的equals(),例如:
select age from user 與 select AGE from user不會匹配,因為大小寫不同;
select age from use 與 select age from user不會匹配,因為空格不同;
sql兩邊的空格可忽略,可以認(rèn)為是對key進(jìn)行過trim操作之后再進(jìn)行equals比較。
查看mysql設(shè)置參數(shù)
執(zhí)行
show variables like '%query_cache%';
可以看到相關(guān)參數(shù):
query_cache_type:0-不啟用查詢緩存;1-啟用,2-啟用,默認(rèn)值為0;
query_cache_size:設(shè)置緩存區(qū)總大小,允許設(shè)置query_cache_size的值最小為40K,默認(rèn)1M,推薦設(shè)置為:64M/128M;
query_cache_limit:限制緩存區(qū)最大能緩存的單條查詢記錄集大小,默認(rèn)設(shè)置為1M
query_cache_type為1時,只要符合查詢緩存的要求,客戶端的查詢語句和記錄集都可以緩存起來,如果SQL中加上 SQL_NO_CACHE將不緩存;
query_cache_type為2時,只要SQL中添加了參數(shù):SQL_CACHE,且符合查詢緩存的要求,客戶端的查詢語句和記錄集,則可以緩存起來。
查看緩存使用情況
show status like '%Qcache%%';
可以看到相關(guān)參數(shù):
Qcache_hits:緩存命中次數(shù);
Qcache_inserts:緩存中插入次數(shù),每緩存一次加1,注意這個不是緩存數(shù)量;
開啟查詢緩存
設(shè)置選項query_cache_type = 1 ,同時設(shè)置query_cache_size = 67108864;
注:query_cache_size的值設(shè)置在100MB以內(nèi)即可。在MySQL里查詢緩存是由一個全局鎖在控制,每次更新查詢緩存的內(nèi)存塊都需要進(jìn)行鎖定。
關(guān)閉查詢緩存
設(shè)置選項query_cache_type = 0,同時設(shè)置query_cache_size = 0。
適用場景
用于頻繁提交同一個語句,并且該表數(shù)據(jù)變化不是很頻繁的場景,例如一些靜態(tài)頁面,或者頁面中的某塊不經(jīng)常發(fā)生變化的信息。
由于查詢緩存需要緩存最新數(shù)據(jù)結(jié)果,因此表數(shù)據(jù)發(fā)生任何變化(insert、update、delete或其他可能產(chǎn)生數(shù)據(jù)變化的操作),都會導(dǎo)致查詢緩存被刷新。因而,對于一個更新頻率非常低而只讀查詢頻率非常高的場景下,打開查詢緩存還是比較有優(yōu)勢的。
不適用場景
查詢緩存嚴(yán)格要求2次SQL請求要完全一樣,包括SQL語句,連接的數(shù)據(jù)庫、協(xié)議版本、字符集等因素都會影響。下面為查詢緩存不適用的幾個場景:
子查詢;
過程、函數(shù)、觸發(fā)器、event中調(diào)用的SQL,或者引用到這些結(jié)果的;
查詢中涉及一些特殊函數(shù)時,例如:BENCHMARK()、CURDATE()、CURRENT_TIME()、CURRENT_TIMESTAMP()、NOW()、SLEEP()、CONNECTION_ID()、CURRENT_DATE()、CURRENT_USER()、PASSWORD()、RAND()、UUID()、ENCRYPT()、LAST_INSERT_ID()等等;
查詢涉及到mysql,information_schema或performance_schema。
類似SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE、SELECT..INTO OUTFILE/DUMPFILE、SELECT * FROM ... WHERE autoincrement_col IS NULL的查詢;
SELECT執(zhí)行計劃用到臨時表;
未引用任何表的查詢,例如SELECT 1+2;
查詢產(chǎn)生了告警(warnings);
SELECT語句中存在SQL_NO_CACHE關(guān)鍵字;
涉及到分區(qū)表。
關(guān)于mysql數(shù)據(jù)庫查詢緩存原理詳解就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。