溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理詳解

發(fā)布時(shí)間:2020-10-27 09:56:23 來(lái)源:億速云 閱讀:315 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章將為大家詳細(xì)講解有關(guān)mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理詳解,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理是:1、緩存SELECT操作的結(jié)果集和SQL語(yǔ)句,key為sql,value為查詢(xún)結(jié)果集;2、如果新的SELECT語(yǔ)句到了,以這個(gè)sql為key去緩存中查詢(xún),如果匹配,就把緩存的結(jié)果集返回。

mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理是:

概述

查詢(xún)緩存(Query Cache,簡(jiǎn)稱(chēng)QC),存儲(chǔ)SELECT語(yǔ)句及其產(chǎn)生的數(shù)據(jù)結(jié)果。閑來(lái)無(wú)事,做一下這塊的總結(jié),也做個(gè)備忘!

超詳細(xì)的mysql數(shù)據(jù)庫(kù)查詢(xún)緩存總結(jié),值得收藏

mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理詳解

工作原理

  • 緩存SELECT操作的結(jié)果集和SQL語(yǔ)句,key為sql,value為查詢(xún)結(jié)果集;

  • 如果新的SELECT語(yǔ)句到了,以這個(gè)sql為key去緩存中查詢(xún),如果匹配,就把緩存的結(jié)果集返回;

  • 匹配標(biāo)準(zhǔn):與緩存的SQL語(yǔ)句是否完全一樣,sql中字母區(qū)分大小寫(xiě)以及中間的空格,簡(jiǎn)單理解為存儲(chǔ)了一個(gè)key-value結(jié)構(gòu),key為sql,value為sql查詢(xún)結(jié)果,匹配時(shí)使用Java的String的equals(),例如:

  • select age from user 與 select AGE from user不會(huì)匹配,因?yàn)榇笮?xiě)不同;

  • select age from use 與 select age from user不會(huì)匹配,因?yàn)榭崭癫煌?/p>

  • sql兩邊的空格可忽略,可以認(rèn)為是對(duì)key進(jìn)行過(guò)trim操作之后再進(jìn)行equals比較。

查看mysql設(shè)置參數(shù)

執(zhí)行

show variables like '%query_cache%';

mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理詳解

可以看到相關(guān)參數(shù):

  • query_cache_type:0-不啟用查詢(xún)緩存;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ū)最大能緩存的單條查詢(xún)記錄集大小,默認(rèn)設(shè)置為1M

  • query_cache_type為1時(shí),只要符合查詢(xún)緩存的要求,客戶(hù)端的查詢(xún)語(yǔ)句和記錄集都可以緩存起來(lái),如果SQL中加上 SQL_NO_CACHE將不緩存;

  • query_cache_type為2時(shí),只要SQL中添加了參數(shù):SQL_CACHE,且符合查詢(xún)緩存的要求,客戶(hù)端的查詢(xún)語(yǔ)句和記錄集,則可以緩存起來(lái)。

查看緩存使用情況

show status like '%Qcache%%';

mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理詳解

可以看到相關(guān)參數(shù):

  • Qcache_hits:緩存命中次數(shù);

  • Qcache_inserts:緩存中插入次數(shù),每緩存一次加1,注意這個(gè)不是緩存數(shù)量;

開(kāi)啟查詢(xún)緩存

設(shè)置選項(xiàng)query_cache_type = 1 ,同時(shí)設(shè)置query_cache_size = 67108864;

注:query_cache_size的值設(shè)置在100MB以?xún)?nèi)即可。在MySQL里查詢(xún)緩存是由一個(gè)全局鎖在控制,每次更新查詢(xún)緩存的內(nèi)存塊都需要進(jìn)行鎖定。

關(guān)閉查詢(xún)緩存

設(shè)置選項(xiàng)query_cache_type = 0,同時(shí)設(shè)置query_cache_size = 0。

適用場(chǎng)景

用于頻繁提交同一個(gè)語(yǔ)句,并且該表數(shù)據(jù)變化不是很頻繁的場(chǎng)景,例如一些靜態(tài)頁(yè)面,或者頁(yè)面中的某塊不經(jīng)常發(fā)生變化的信息。

由于查詢(xún)緩存需要緩存最新數(shù)據(jù)結(jié)果,因此表數(shù)據(jù)發(fā)生任何變化(insert、update、delete或其他可能產(chǎn)生數(shù)據(jù)變化的操作),都會(huì)導(dǎo)致查詢(xún)緩存被刷新。因而,對(duì)于一個(gè)更新頻率非常低而只讀查詢(xún)頻率非常高的場(chǎng)景下,打開(kāi)查詢(xún)緩存還是比較有優(yōu)勢(shì)的。

不適用場(chǎng)景

查詢(xún)緩存嚴(yán)格要求2次SQL請(qǐng)求要完全一樣,包括SQL語(yǔ)句,連接的數(shù)據(jù)庫(kù)、協(xié)議版本、字符集等因素都會(huì)影響。下面為查詢(xún)緩存不適用的幾個(gè)場(chǎng)景:

  • 子查詢(xún);

  • 過(guò)程、函數(shù)、觸發(fā)器、event中調(diào)用的SQL,或者引用到這些結(jié)果的;

  • 查詢(xún)中涉及一些特殊函數(shù)時(shí),例如:BENCHMARK()、CURDATE()、CURRENT_TIME()、CURRENT_TIMESTAMP()、NOW()、SLEEP()、CONNECTION_ID()、CURRENT_DATE()、CURRENT_USER()、PASSWORD()、RAND()、UUID()、ENCRYPT()、LAST_INSERT_ID()等等;

  • 查詢(xún)涉及到mysql,information_schema或performance_schema。

  • 類(lèi)似SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE、SELECT..INTO OUTFILE/DUMPFILE、SELECT * FROM ... WHERE autoincrement_col IS NULL的查詢(xún);

  • SELECT執(zhí)行計(jì)劃用到臨時(shí)表;

  • 未引用任何表的查詢(xún),例如SELECT 1+2;

  • 查詢(xún)產(chǎn)生了告警(warnings);

  • SELECT語(yǔ)句中存在SQL_NO_CACHE關(guān)鍵字;

  • 涉及到分區(qū)表。

關(guān)于mysql數(shù)據(jù)庫(kù)查詢(xún)緩存原理詳解就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI