原理與作用
當(dāng)一個(gè)請(qǐng)求到達(dá)MySQL后谣沸,先到查詢(xún)緩存查看是否以前執(zhí)行過(guò)該語(yǔ)句。之前執(zhí)行過(guò)的語(yǔ)句及其結(jié)果可能會(huì)以 key-value 對(duì)的形式笋颤,被直接緩存在內(nèi)存中。key 是查詢(xún)的語(yǔ)句伴澄,value 是查詢(xún)的結(jié)果赋除。如果你的查詢(xún)能夠直接在這個(gè)緩存中找到 key非凌,就會(huì)將 value被直接返回給客戶(hù)端。
如果語(yǔ)句在查詢(xún)緩存中不命中敞嗡,就會(huì)繼續(xù)正常的查詢(xún)過(guò)程航背。執(zhí)行完成后,將執(zhí)行結(jié)果作為value玖媚,將查詢(xún)語(yǔ)句作為key存入查詢(xún)緩存。
可以看到今魔,如果查詢(xún)命中緩存,MySQL 不需要執(zhí)行后面的復(fù)雜操作涡贱,就可以直接返回結(jié)果,這個(gè)效率會(huì)很高。
建議
大多數(shù)情況下不要使用查詢(xún)緩存督函,因?yàn)椴樵?xún)緩存往往弊大于利。
查詢(xún)緩存的失效非常頻繁辰狡,只要有對(duì)一個(gè)表的更新,這個(gè)表上所有的查詢(xún)緩存都會(huì)被清空宛篇。因此很可能你費(fèi)勁地把查詢(xún)結(jié)果緩存起來(lái),還沒(méi)使用呢叫倍,就被一個(gè)更新全清空了。對(duì)于更新比較頻繁的數(shù)據(jù)庫(kù)來(lái)說(shuō)吆倦,查詢(xún)緩存的命中率非常低。
需要注意的是蚕泽,MySQL 8.0 版本直接將查詢(xún)緩存的整塊功能刪掉了,也就是說(shuō) 8.0 開(kāi)始徹底沒(méi)有這個(gè)功能了
使用場(chǎng)景
對(duì)于寫(xiě)少讀多的場(chǎng)景比較適用须妻。比如仔蝌,一個(gè)系統(tǒng)配置表,那這張表上的查詢(xún)才適合使用查詢(xún)緩存荒吏。
MySQL 也提供了這種“按需使用”的方式敛惊。你可以將參數(shù) query_cache_type 設(shè)置成 DEMAND,這樣對(duì)于默認(rèn)的 SQL 語(yǔ)句都不使用查詢(xún)緩存绰更。而對(duì)于你確定要使用查詢(xún)緩存的語(yǔ)句篓像,可以用 SQL_CACHE 顯式指定皿伺,像下面這個(gè)語(yǔ)句一樣:
select SQL_CACHE * from Table1 where ID=10员辩;