新聞中心
在MySQL數(shù)據(jù)庫(kù)中,用戶可能多次執(zhí)行相同的查詢語(yǔ)句。為了提高查詢效率,數(shù)據(jù)庫(kù)會(huì)在內(nèi)存在劃分一個(gè)專門的區(qū)域,用來(lái)存放用戶最近執(zhí)行的查詢,這塊區(qū)域就是緩存。因?yàn)閮?nèi)存的運(yùn)行速度要比硬盤快的多。為此通過(guò)緩存機(jī)制,就可以提高查詢的效率。當(dāng)用戶下一次再執(zhí)行相同查詢時(shí),就可以直接從緩存中獲取數(shù)據(jù),而不用到硬盤中的數(shù)據(jù)文件中去讀取數(shù)據(jù),也可以省去相關(guān)解析的工作。

專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)景德鎮(zhèn)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
一、數(shù)據(jù)緩存的應(yīng)用環(huán)境
并不是在任何情況下數(shù)據(jù)緩存都能夠起到應(yīng)有的效果。如果企業(yè)有一個(gè)不經(jīng)常改變的表并且服務(wù)器受到這個(gè)表的大量的相同查詢時(shí),數(shù)據(jù)緩存才能夠起到不錯(cuò)的效果。通常情況下,針對(duì)Web的應(yīng)用,效果會(huì)比較明顯。如現(xiàn)在在數(shù)據(jù)庫(kù)中有一張產(chǎn)品信息表。企業(yè)的用戶需要通過(guò)網(wǎng)頁(yè)來(lái)查詢產(chǎn)品的信息。如果在系統(tǒng)設(shè)計(jì)時(shí),默認(rèn)查詢的結(jié)果是顯示最近一個(gè)月交易過(guò)的產(chǎn)品信息。那么每次用戶按默認(rèn)情況查詢產(chǎn)品信息時(shí),將都會(huì)從緩存中獲取信息(如果相關(guān)的信息沒(méi)有被更新過(guò))。此時(shí)系統(tǒng)查詢的速度就會(huì)比較快。
如果企業(yè)有一個(gè)不經(jīng)常改變的表并且服務(wù)器受到這個(gè)表的大量的相同查詢時(shí),筆者就建議大家啟用數(shù)據(jù)緩存機(jī)制。在啟動(dòng)之前,可以先使用命名(如上圖所示)來(lái)查詢現(xiàn)在系統(tǒng)緩存是否開(kāi)啟。如上圖所示,如果查詢的結(jié)果是YES的話,那么就說(shuō)明系統(tǒng)中已經(jīng)開(kāi)啟了數(shù)據(jù)緩存機(jī)制。
二、數(shù)據(jù)緩存使用的限制
并不是在任何情況下,數(shù)據(jù)緩存都會(huì)起到改善查詢的效果。根據(jù)筆者的項(xiàng)目經(jīng)驗(yàn),認(rèn)為在一下幾種情況,數(shù)據(jù)緩存機(jī)制的效果并不會(huì)很大。
一是查詢所涉及到的表會(huì)經(jīng)常更改。如在一個(gè)進(jìn)銷存管理系統(tǒng)中,可能會(huì)有產(chǎn)品與銷售記錄兩張表格。產(chǎn)品表一般不怎么會(huì)更新,而銷售記錄表就可能每分鐘都會(huì)發(fā)生變化。此時(shí)對(duì)于銷售記錄表來(lái)說(shuō),采用緩存機(jī)制就不會(huì)起到多大的效果。因?yàn)楦鶕?jù)緩存的工作原理,當(dāng)某個(gè)表被更改后,其對(duì)應(yīng)的數(shù)據(jù)緩存的相關(guān)條目就會(huì)被清空。
二是查詢緩存不使用與服務(wù)器方便些的語(yǔ)句。根據(jù)B/S或者C/S架構(gòu),可以將相關(guān)應(yīng)用分為服務(wù)器斷和客戶端兩類。在使用數(shù)據(jù)緩存時(shí),數(shù)據(jù)庫(kù)管理員要考慮到,在MySQL數(shù)據(jù)庫(kù)中,查詢緩存并不適用于服務(wù)器方所編寫(xiě)的查詢語(yǔ)句。當(dāng)數(shù)據(jù)庫(kù)管理員正在使用服務(wù)器方編寫(xiě)的語(yǔ)句時(shí),要注意到這些語(yǔ)句并不會(huì)應(yīng)用緩存技術(shù)。
三是查詢時(shí)使用緩存的兩個(gè)基本條件:所采用的查詢語(yǔ)句完全一樣以及相關(guān)數(shù)據(jù)表妹歐發(fā)生更改。對(duì)于后面一條,上面已經(jīng)談到過(guò)。這里筆者要說(shuō)的是,什么叫做查詢語(yǔ)句瓦圈一樣?簡(jiǎn)單的說(shuō),就是前后使用的兩條查詢語(yǔ)句(不一定要連在一起)完全一致。不僅包括查詢的字段,也包括查詢的條件。在這里要認(rèn)識(shí)到一個(gè)誤區(qū)。如果在5分鐘之前用戶查詢一個(gè)產(chǎn)品信息表,其沒(méi)有用到任何查詢條件,查詢?nèi)康漠a(chǎn)品信息記錄。5分鐘之后又有一個(gè)用戶查詢產(chǎn)品信息表,此時(shí)其使用了查詢條件,如只查詢最近一個(gè)月新建的產(chǎn)品信息。顯然此時(shí)后面一個(gè)查詢的結(jié)果是前面一個(gè)查詢結(jié)果的子集(不考慮產(chǎn)品基本表在這個(gè)時(shí)間間隔中是否做了更改)。照理來(lái)說(shuō)應(yīng)該可以使用數(shù)據(jù)緩存。但是這里需要注意,此時(shí)前后兩條查詢語(yǔ)句,其是不相同的(其查詢條件不同)。即使結(jié)果是相同的,或者具有包含關(guān)系,數(shù)據(jù)庫(kù)仍然會(huì)先重新解析SQL語(yǔ)句,然后從硬盤上的數(shù)據(jù)文件中去獲取數(shù)據(jù)。
另外需要注意的是如果用戶在查詢語(yǔ)句中,使用了自定義函數(shù)、自定義變量或者因引用了系統(tǒng)數(shù)據(jù)庫(kù)中的表,那么緩存機(jī)制也會(huì)失效。
三、提高緩存的使用效果
通過(guò)數(shù)據(jù)庫(kù)的合理設(shè)計(jì),可以提高緩存的使用效果,擴(kuò)大緩存的使用領(lǐng)域。具體的說(shuō),數(shù)據(jù)庫(kù)管理員可以從如下幾個(gè)方面出發(fā)。
1、 根據(jù)數(shù)據(jù)變化的頻率來(lái)分解表
如現(xiàn)在有產(chǎn)品基本資料與產(chǎn)品最新庫(kù)存兩部分內(nèi)容。在不考慮緩存的情況下,可以將產(chǎn)品基本資料與產(chǎn)品庫(kù)存放在同一個(gè)表中,然后通過(guò)其他作業(yè)來(lái)更新這個(gè)庫(kù)存數(shù)量。如此的話,在前臺(tái)界面中,就可以直觀的反映出產(chǎn)品的庫(kù)存數(shù)量。但是從緩存的設(shè)計(jì)角度來(lái)看,這么操作并不是很合理。因?yàn)楫a(chǎn)品信息相對(duì)來(lái)說(shuō)不怎么會(huì)變化,而庫(kù)存數(shù)量卻經(jīng)常在發(fā)生變化。如果將他們放在同一張表上,由于庫(kù)存數(shù)量的不斷更新,數(shù)據(jù)緩存中的內(nèi)容就會(huì)不斷被清空(與產(chǎn)品信息表相關(guān)的數(shù)據(jù)緩存)。此時(shí)如果很多用戶要查詢產(chǎn)品的描述、規(guī)格(他們可能并不關(guān)注產(chǎn)品的庫(kù)存),那么他們就無(wú)法使用數(shù)據(jù)緩存。因?yàn)榫彺嬷袥](méi)有相關(guān)的數(shù)據(jù)(由于庫(kù)存數(shù)量不斷變化而被清空)。
遇到這種情況時(shí),數(shù)據(jù)庫(kù)管理員就可以將庫(kù)存數(shù)量與產(chǎn)品基本信息存放在兩張不同的表上,然后通過(guò)關(guān)鍵字來(lái)進(jìn)行關(guān)聯(lián)。這么做的好處就是庫(kù)存數(shù)量更新并不會(huì)影響到產(chǎn)品基本信息表所對(duì)應(yīng)的數(shù)據(jù)緩存(他們是兩張表)。從而提高產(chǎn)品信息查詢時(shí)的緩存命中率。
2、 采用默認(rèn)條件的查詢來(lái)提高緩存命中率
在上面的分析中筆者談到,要兩條完全相同的SQL語(yǔ)句才能夠使用緩存。條件不同或者使用的字段不同,數(shù)據(jù)庫(kù)系統(tǒng)都不會(huì)使用緩存來(lái)進(jìn)行查詢優(yōu)化。另外MySQL數(shù)據(jù)庫(kù)與其他數(shù)據(jù)庫(kù)不一樣,對(duì)于SQL語(yǔ)句解析來(lái)說(shuō),其大小寫(xiě)實(shí)敏感的。也就是說(shuō)同一條查詢語(yǔ)句,如果其關(guān)鍵字的大小寫(xiě)不同,那么也會(huì)被認(rèn)為是用了不同的SQL語(yǔ)句。這一點(diǎn)是比較讓人頭疼的。針對(duì)這種情況,在客戶端應(yīng)用程序設(shè)計(jì)時(shí),最好注意以下幾點(diǎn)。
一是要習(xí)慣采用默認(rèn)條件的查詢來(lái)提高緩存命中率。如在設(shè)計(jì)產(chǎn)品信息查詢這個(gè)功能,可以考慮默認(rèn)查詢?nèi)啃畔⒒蛘咧付硞€(gè)固定的條件。如此就可以提高緩存的命中率。而不要在不同的用戶界面設(shè)置不同的默認(rèn)值。某些應(yīng)用系統(tǒng),為了提高界面的友好性,會(huì)給用戶提供一些個(gè)性化設(shè)置的參數(shù),以保存用戶的個(gè)性化內(nèi)容。此時(shí)雖然可以提高界面的人性化,但是顯然會(huì)降低數(shù)據(jù)緩存的命中率。遇到這種情況時(shí),數(shù)據(jù)庫(kù)管理員就需要在人性化設(shè)計(jì)與系統(tǒng)的查詢性能之間進(jìn)行均衡。
不同的應(yīng)用針對(duì)同一個(gè)表格的相同查詢,其查詢語(yǔ)句最好相同。如現(xiàn)在對(duì)于產(chǎn)品信息,即可以通過(guò)產(chǎn)品信息窗口進(jìn)行查詢,也可以根據(jù)報(bào)表來(lái)查詢。此時(shí)其對(duì)應(yīng)的后臺(tái)表格是相同的。只要其執(zhí)行的查詢語(yǔ)句相同、并且在這段時(shí)間之內(nèi)數(shù)據(jù)庫(kù)表格沒(méi)有發(fā)生變化,那么系統(tǒng)就可以從緩存中獲取數(shù)據(jù)。在實(shí)際工作中,窗體與報(bào)表往往是有不同的人設(shè)計(jì)與開(kāi)發(fā)的。如果現(xiàn)在這兩個(gè)人SQL語(yǔ)句的書(shū)寫(xiě)習(xí)慣不同,一個(gè)人喜歡用大寫(xiě),而另外一個(gè)人喜歡用小寫(xiě)。在系統(tǒng)中,對(duì)于SQL查詢語(yǔ)句解析時(shí)區(qū)分大小寫(xiě)。如果大小寫(xiě)不同,則會(huì)被認(rèn)為不同的SQL語(yǔ)句,此時(shí)系統(tǒng)也就無(wú)法使用緩存了。為此在遇到這種情況時(shí),不同的用戶之間要統(tǒng)一SQL語(yǔ)句的書(shū)寫(xiě)規(guī)范,如要么全部使用大寫(xiě),要么全部使用小寫(xiě)。項(xiàng)目管理員要根據(jù)實(shí)際情況來(lái)制定相關(guān)的規(guī)則。
3、 提高緩存空間大小來(lái)提高數(shù)據(jù)庫(kù)的緩存命中率
當(dāng)數(shù)據(jù)緩存滿時(shí),新的數(shù)據(jù)會(huì)覆蓋舊的數(shù)據(jù)。如現(xiàn)在用戶查詢了一筆產(chǎn)品信息。1個(gè)小時(shí)后其在利用相同的語(yǔ)句查詢了這個(gè)產(chǎn)品信息(假設(shè)在這個(gè)過(guò)程中產(chǎn)品信息表沒(méi)有發(fā)生變化)。查詢語(yǔ)句是否會(huì)采用緩存呢?答案是不一定。如果企業(yè)服務(wù)器的緩存空間足夠的大,舊的緩存信息沒(méi)有被新的查詢內(nèi)容所覆蓋,那么就會(huì)采用緩存中的信息。相反,如果緩存比較小,此時(shí)系統(tǒng)舊的緩存信息就會(huì)被新的查詢內(nèi)容所覆蓋掉。在這種情況下,即使查詢的語(yǔ)句相同、表格也沒(méi)有發(fā)生變化,數(shù)據(jù)庫(kù)系統(tǒng)仍然要從硬盤上的數(shù)據(jù)文件中去獲取數(shù)據(jù)。
為此為了提高查詢的效率,提高緩存的命中率,最好能夠增加服務(wù)器上緩存的空間?,F(xiàn)在內(nèi)存價(jià)格比較便宜,這筆投資應(yīng)該不會(huì)太大。特別是當(dāng)在一臺(tái)服務(wù)器上實(shí)現(xiàn)不同的應(yīng)用時(shí),提高內(nèi)存的容量還是蠻有必要的。
關(guān)于MySQL數(shù)據(jù)庫(kù)中緩存管理的解析就為大家介紹這么多,希望大家都能夠從中有所收獲,以后如果在工作中遇到類似問(wèn)題,就可以輕松解決了。
本文標(biāo)題:MySQL數(shù)據(jù)庫(kù)中緩存管理的思路解析
標(biāo)題路徑:http://m.fisionsoft.com.cn/article/dhiogcs.html


咨詢
建站咨詢
