專利名稱:一種數(shù)據(jù)庫(kù)查詢方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)庫(kù)查詢方法。
背景技術(shù):
MYSQL是目前應(yīng)用最廣泛的開源關(guān)系數(shù)據(jù)庫(kù),以高并發(fā),高效率著稱。MYSQL為不同應(yīng)用業(yè)務(wù)提供不同的數(shù)據(jù)庫(kù)引擎,主要的數(shù)據(jù)庫(kù)引擎有Myisam,InnoDB。Myisam管理非事務(wù)表,它提供高速存儲(chǔ)和檢索,以及全文搜索能力。InnoDB給MYSQL提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID兼容)存儲(chǔ)引擎。目前MYSQL都是使用其內(nèi)部的緩存系統(tǒng)。MYSQL在接收到查詢語(yǔ)句時(shí)先對(duì)查詢語(yǔ)句進(jìn)行解析,然后根據(jù)解析完的數(shù)據(jù)去內(nèi)存中查找是否有存在該查詢語(yǔ)句的緩存,有的話 則直接返回該緩存,沒有的話,則再根據(jù)SQL語(yǔ)法去磁盤進(jìn)行數(shù)據(jù)查詢。MYSQL的查詢緩存是以每條查詢語(yǔ)句為基本單位,以整個(gè)表的所有的查詢緩存為管理單位。如果某一張數(shù)據(jù)表的任何一行數(shù)據(jù)發(fā)生變化,就會(huì)把整個(gè)數(shù)據(jù)表所涉及到的查詢緩存全部清除。在現(xiàn)實(shí)業(yè)務(wù)邏輯中,一條記錄的更新,一般都只涉及到其中的幾個(gè)查詢緩存,而一個(gè)表的緩存大部分都是無(wú)關(guān)的,所以不應(yīng)該被清除,導(dǎo)致相同的SQL要多次進(jìn)行磁盤查詢。
發(fā)明內(nèi)容
本發(fā)明的目的在于提出一種數(shù)據(jù)庫(kù)查詢方法,能夠極大地減少數(shù)據(jù)庫(kù)的查詢量,提供服務(wù)器性能,加快對(duì)用戶的響應(yīng)速度。為達(dá)此目的,本發(fā)明采用以下技術(shù)方案
一種數(shù)據(jù)庫(kù)查詢方法,適用于MYSQL數(shù)據(jù)庫(kù),包括以下步驟
A、以查詢語(yǔ)句進(jìn)行第一次查詢時(shí),采用memcache的偽命名空間,將查詢語(yǔ)句對(duì)應(yīng)的第一結(jié)果數(shù)據(jù)定義為第一命名空間,第一命名空間的鍵值包括查詢語(yǔ)句、第一版本值和原有的鍵,并存儲(chǔ)在緩存中;
B、采用memcache的偽命名空間,將第一版本值定義為第二命名空間,第二命名空間的鍵值包括第一次版本值和查詢語(yǔ)句,并存儲(chǔ)在緩存中;
C、如果第一結(jié)果數(shù)據(jù)對(duì)應(yīng)的記錄更新后,將緩存中第一版本值改為第二版本值;
D、以所述查詢語(yǔ)句進(jìn)行第二次查詢時(shí),從緩存中獲取查詢語(yǔ)句對(duì)應(yīng)版本值,采用memcache的偽命名空間,將查詢語(yǔ)句定義為第三命名空間,第三命名空間的鍵值包括查詢語(yǔ)句、查詢語(yǔ)句對(duì)應(yīng)版本值和原有的鍵;
E、判斷第三命名空間的鍵值,如果第三命名空間的鍵值與第一命名空間的鍵值相同,則將緩存中的第一結(jié)果數(shù)據(jù)作為第二次查詢的結(jié)果數(shù)據(jù),如果第三命名空間的鍵值與第一命名空間的鍵值不同,則從數(shù)據(jù)庫(kù)中查詢結(jié)果數(shù)據(jù)。步驟E中,如果第三命名空間的鍵值與第一命名空間的鍵值不同,將緩存中的第一命名空間清除。
步驟C中,緩存中第一版本值加一后改為第二版本值。步驟E還包括以下步驟
將從數(shù)據(jù)庫(kù)中查詢的結(jié)果數(shù)據(jù)采用memcache的偽命名空間定義為第四命名空間,第四命名空間的鍵值包括查詢語(yǔ)句、第二版本值和原有的鍵,并存儲(chǔ)在緩存中。采用了本發(fā)明的技術(shù)方案,能夠極大地減少數(shù)據(jù)庫(kù)的查詢量,提高服務(wù)器性能,加快對(duì)用戶的響應(yīng)速度,減少服務(wù)器數(shù)量,降低成本。
圖I是本發(fā)明具體實(shí)施方式
中數(shù)據(jù)庫(kù)查詢的流程圖。
具體實(shí)施例方式下面結(jié)合附圖并通過具體實(shí)施方式
來(lái)進(jìn)一步說(shuō)明本發(fā)明的技術(shù)方案。本發(fā)明技術(shù)方案的主要思想是利用memcache的偽命名空間,把相關(guān)的查詢語(yǔ)句定義為一個(gè)命名空間,每次相關(guān)的記錄被更新時(shí),只清除相對(duì)應(yīng)的命名空間內(nèi)的緩存,而同一數(shù)據(jù)表的其它命名空間的緩存則不會(huì)被清除,這樣就減少了大量SQL的磁盤操作。其中,memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨大的hash表,它能夠用來(lái)存儲(chǔ)各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫(kù)檢索的結(jié)果等。memcache的偽命名空間memcache是key-value的內(nèi)存hash服務(wù)器,只能根據(jù)單個(gè)key來(lái)取值和刪除。圖I是本發(fā)明具體實(shí)施方式
中數(shù)據(jù)庫(kù)查詢的流程圖。如圖I所示,該適用于MYSQL數(shù)據(jù)庫(kù)的查詢流程包括
步驟101、以查詢語(yǔ)句進(jìn)行第一次查詢時(shí),采用memcache的偽命名空間,將查詢語(yǔ)句對(duì)應(yīng)的第一結(jié)果數(shù)據(jù)定義為第一命名空間,第一命名空間的鍵值包括查詢語(yǔ)句、第一版本值和原有的鍵,并存儲(chǔ)在緩存中。例如查找張三的照片,則輸入查詢語(yǔ)句“photo_張三”,把從數(shù)據(jù)庫(kù)中獲得的張三的照片數(shù)據(jù),采用memcache的偽命名空間定義為命名空間,該命名空間的鍵值為“photo_張三_l_md5 (sql) ”,其中“photo_張三”是查詢語(yǔ)句,“ I ”是版本值,“md5 (sql) ”是原有的鍵。步驟102、同時(shí),采用memcache的偽命名空間,將第一版本值定義為第二命名空間,第二命名空間的鍵值包括第一次版本值和查詢語(yǔ)句,并存儲(chǔ)在緩存中。例如對(duì)于張三的照片,也將第一次查詢的第一版本值“I”定義為一個(gè)命名空間,該命名空間的鍵值為“1_photo_ 張三”。步驟103、如果第一結(jié)果數(shù)據(jù)對(duì)應(yīng)的記錄更新后,將緩存中第一版本值改為第二版本值。如果張三的照片沒有改變,則在緩存中保存的版本值不會(huì)發(fā)生變化。如果張三的照片發(fā)生了改變,則根據(jù)查詢語(yǔ)句“photo_張三”查詢到緩存中對(duì)應(yīng)的版本值的命名空間,即“ l_photo_張三”,將其中的版本值加一,變?yōu)椤?l_photo_張三”,其中“2”就是第二版本值。步驟104、以所述查詢語(yǔ)句進(jìn)行第二次查詢時(shí),從緩存中獲取查詢語(yǔ)句對(duì)應(yīng)版本值,采用memcache的偽命名空間,將查詢語(yǔ)句定義為第三命名空間,第三命名空間的鍵值包括查詢語(yǔ)句、查詢語(yǔ)句對(duì)應(yīng)版本值和原有的鍵。當(dāng)?shù)诙我浴皃hoto_張三”作為查詢語(yǔ)句查詢張三的照片時(shí),首先從緩存中查找到該查詢語(yǔ)句對(duì)應(yīng)的版本值,如果張三照片沒有發(fā)生變化,則版本值為1,如果張三照片發(fā)生了變化,則版本值已經(jīng)改為2。然后將查詢語(yǔ)句定義為一個(gè)命名空間,該命名空間的鍵值為“photo_張三_2_md5 (sql) ”,其中“photo_張三”是查詢語(yǔ)句,“2”是版本值,“md5 (sql) ”是原有的鍵。步驟105、判斷第三命名空間的鍵值,如果第三命名空間的鍵值與第一命名空間的鍵值相同,則將緩存中的第一結(jié)果數(shù)據(jù)作為第二次查詢的結(jié)果數(shù)據(jù),如果第三命名空間的鍵值與第一命名空間的鍵值不同,則從數(shù)據(jù)庫(kù)中查詢結(jié)果數(shù)據(jù)。把為第二次查詢語(yǔ)句定義的命名空間的鍵值與緩存中對(duì)應(yīng)的鍵值進(jìn)行對(duì)比,如果張三照片沒有變化,第二次對(duì)張三照片的查詢語(yǔ)句定義的命名空間的鍵值是“photo_張三 _l_md5 (sql) ”,緩存中對(duì)應(yīng)“photo_張三”的命名空間鍵值是“photo_張三_l_md5 (sql) ”,這樣兩個(gè)鍵值相同,就直接從緩存中取出結(jié)果數(shù)據(jù),作為“photo_張三”作為查詢語(yǔ)句的查詢結(jié)果。如果張三照片發(fā)生了變化,第二次對(duì)張三照片的查詢語(yǔ)句定義的命名空間的鍵值是“photo_張三_2_md5 (sql) ”,緩存中對(duì)應(yīng)“photo_張三”的命名空間鍵值是“photo_張三_l_md5 (sql) ”,兩個(gè)鍵值不同,則再?gòu)臄?shù)據(jù)庫(kù)查詢“ph0t0_張三”,獲得結(jié)果數(shù)據(jù)后反饋。同時(shí)將緩存中命名空間鍵值是“photo_張三_l_md5(sql) ”的數(shù)據(jù)刪除。本步驟中,還要將從數(shù)據(jù)庫(kù)中查詢的結(jié)果數(shù)據(jù)采用memcache的偽命名空間定義為第四命名空間,第四命名空間的鍵值包括查詢語(yǔ)句、第二版本值和原有的鍵,并存儲(chǔ)在緩存中。也就是說(shuō),還要把從數(shù)據(jù)庫(kù)查詢獲得的結(jié)果數(shù)據(jù)定義一個(gè)命名空間,該命名空間的鍵值為“photo_張三_2_md5 (sql) ”,與第二次查詢語(yǔ)句定義的命名空間鍵值相同,為后續(xù)的查詢做準(zhǔn)備。如果張三的照片下面還區(qū)分了不同專輯,比如有專輯一、專輯二等,這樣則把SQL查詢做一定的關(guān)聯(lián)。如下是數(shù)據(jù)庫(kù)存儲(chǔ)用戶的相片的結(jié)構(gòu)邏輯用戶——相冊(cè)專輯——相片。用戶擁有多個(gè)相冊(cè)專輯,然后相冊(cè)專輯再存儲(chǔ)相片。而業(yè)務(wù)邏輯是根據(jù)用戶取相片,或是取某一個(gè)專輯下的相片,所以第一級(jí)以用戶的ID為前綴的memcache命名空間key前綴為photo_userid_version,而第二級(jí)就再加上相冊(cè)專輯的ID作為前綴photo_userid_albumid_version ,這時(shí)就可以按多級(jí)來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)查詢結(jié)果。當(dāng)查詢用戶ID為I的相片,則key為photo_l_l,而查詢?cè)撚脩粝碌膇d為2的專輯時(shí)則 key 為 photo_l_album_2_l。如果刪除了該用戶下的某一張圖片,而又能知道這張圖片是屬于專輯為2,則再查詢時(shí)更新該用戶的相片命名空間的version,下一次要查詢?cè)撚脩粝碌南嗥?,則其key為photo_l_2,所以該用戶key為photo_l_l的圖片的緩存就被清除,而屬于同一個(gè)相片表的其它用戶的相片則不會(huì)被清除緩存。如果再查詢時(shí)更新該圖片所在專輯的version,下一次查詢?cè)搶]嬒碌膱D片時(shí)key就為photo_l_album_2_2, key為photo_l_album_2_l的圖片的緩存就被清除,該用戶的其它專輯的緩存也不會(huì)被清除。以上所述,僅為本發(fā)明較佳的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉該技術(shù)的人在本發(fā)明所揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之 內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍為準(zhǔn)。
權(quán)利要求
1.一種數(shù)據(jù)庫(kù)查詢方法,適用于MYSQL數(shù)據(jù)庫(kù),其特征在于,包括以下步驟 A、以查詢語(yǔ)句進(jìn)行第一次查詢時(shí),采用memcache的偽命名空間,將查詢語(yǔ)句對(duì)應(yīng)的第一結(jié)果數(shù)據(jù)定義為第一命名空間,第一命名空間的鍵值包括查詢語(yǔ)句、第一版本值和原有的鍵,并存儲(chǔ)在緩存中; B、采用memcache的偽命名空間,將第一版本值定義為第二命名空間,第二命名空間的鍵值包括第一次版本值和查詢語(yǔ)句,并存儲(chǔ)在緩存中; C、如果第一結(jié)果數(shù)據(jù)對(duì)應(yīng)的記錄更新后,將緩存中第一版本值改為第二版本值; D、以所述查詢語(yǔ)句進(jìn)行第二次查詢時(shí),從緩存中獲取查詢語(yǔ)句對(duì)應(yīng)版本值,采用memcache的偽命名空間,將查詢語(yǔ)句定義為第三命名空間,第三命名空間的鍵值包括查詢語(yǔ)句、查詢語(yǔ)句對(duì)應(yīng)版本值和原有的鍵; E、判斷第三命名空間的鍵值,如果第三命名空間的鍵值與第一命名空間的鍵值相同,則將緩存中的第一結(jié)果數(shù)據(jù)作為第二次查詢的結(jié)果數(shù)據(jù),如果第三命名空間的鍵值與第一命名空間的鍵值不同,則從數(shù)據(jù)庫(kù)中查詢結(jié)果數(shù)據(jù)。
2.根據(jù)權(quán)利要求I所述的一種數(shù)據(jù)庫(kù)查詢方法,其特征在于,步驟E中,如果第三命名空間的鍵值與第一命名空間的鍵值不同,將緩存中的第一命名空間清除。
3.根據(jù)權(quán)利要求I所述的一種數(shù)據(jù)庫(kù)查詢方法,其特征在于,步驟C中,緩存中第一版本值加一后改為第二版本值。
4.根據(jù)權(quán)利要求I所述的一種數(shù)據(jù)庫(kù)查詢方法,其特征在于,步驟E還包括以下步驟 將從數(shù)據(jù)庫(kù)中查詢的結(jié)果數(shù)據(jù)采用memcache的偽命名空間定義為第四命名空間,第四命名空間的鍵值包括查詢語(yǔ)句、第二版本值和原有的鍵,并存儲(chǔ)在緩存中。
全文摘要
本發(fā)明公開了一種數(shù)據(jù)庫(kù)查詢方法,以查詢語(yǔ)句進(jìn)行第一次查詢時(shí),將查詢語(yǔ)句對(duì)應(yīng)的第一結(jié)果數(shù)據(jù)定義為第一命名空間,將第一版本值定義為第二命名空間,并存儲(chǔ)在緩存中,如果第一結(jié)果數(shù)據(jù)對(duì)應(yīng)的記錄更新后,將緩存中第一版本值改為第二版本值,以所述查詢語(yǔ)句進(jìn)行第二次查詢時(shí),從緩存中獲取查詢語(yǔ)句對(duì)應(yīng)版本值,將查詢語(yǔ)句定義為第三命名空間,如果第三命名空間的鍵值與第一命名空間的鍵值相同,則將緩存中的第一結(jié)果數(shù)據(jù)作為第二次查詢的結(jié)果數(shù)據(jù),如果第三命名空間的鍵值與第一命名空間的鍵值不同,則從數(shù)據(jù)庫(kù)中查詢結(jié)果數(shù)據(jù)。采用了本發(fā)明的技術(shù)方案,能夠極大地減少數(shù)據(jù)庫(kù)的查詢量,提供服務(wù)器性能,加快對(duì)用戶的響應(yīng)速度。
文檔編號(hào)G06F17/30GK102622361SQ20111003062
公開日2012年8月1日 申請(qǐng)日期2011年1月28日 優(yōu)先權(quán)日2011年1月28日
發(fā)明者陳繁榮 申請(qǐng)人:天脈聚源(北京)傳媒科技有限公司