MySQL數(shù)據(jù)庫查詢步驟和緩存原理
我們知道,數(shù)據(jù)庫的查詢功能是我們經(jīng)常用到的,那么MySQL數(shù)據(jù)庫是怎樣進(jìn)行查詢的呢?本文我們就來介紹一下MySQL數(shù)據(jù)庫的查詢步驟以及緩存原理,接下來就讓我們來一起了解一下這一部分內(nèi)容。
當(dāng)MySQL收到客戶端發(fā)送的查詢語句時,首先會檢查緩存塊中是否緩存中此語句的結(jié)果,如果有,則檢查權(quán)限,如果能通過權(quán)限的檢查則直接返回緩存塊中的結(jié)果集,我們稱之為命中緩存,此時會增加Qcache_hits變量的值。
如果在緩存中找不到此語句的緩存(此時會增加Com_select變量的值),則進(jìn)入下一步:
1、MySQL解析器將查詢語句分解成一個個標(biāo)識,并建立一棵“解析樹”,解析器會使用MySQL的語法解析和驗證這個查詢語句的標(biāo)識的有效性及標(biāo)識是否出現(xiàn)在適當(dāng)?shù)奈恢蒙?,它還會檢查字符串中的引號有沒有閉合。
2、預(yù)處理器會檢查此“解析樹”中的表和列是否存在,列的別名是否混淆,***就是對權(quán)限的檢查,而這些檢查特性是解析器不具備的,只能通過預(yù)處理器來完成。
3、如果前面兩步都通過了檢驗,MySQL的優(yōu)化器則對“解析樹”進(jìn)行優(yōu)化,并根據(jù)所預(yù)測的執(zhí)行成本來生成執(zhí)行成本***的執(zhí)行計劃。***執(zhí)行此計劃,存儲查詢結(jié)果,返回結(jié)果集給客戶端。
通過上述兩個變量值,我們可以通過這個公式計算出緩存的命中率: Qcache_hits / (Qcache_hits_Com_select), 通過命中率來查看我們是否可以從緩存中獲益。這里有一個問題就是:命中率的多少才是***的呢?這個沒有確定值的,要根據(jù)情況而定,如果命中的是那些要篩選大量數(shù)據(jù)才得到的結(jié)果的查詢語句(比如說:GROUP BY, COUNT等),即使命中率很低,但這也是一個很好的命中率值。
任何不是從緩存塊中取得數(shù)據(jù)的查詢語句都稱為:緩存錯失(cache miss), 造成緩存錯失有以下幾種原因:
1、所發(fā)送的查詢語句是不可緩存的,查詢語句不可緩存的原因有兩種:語句包含了不確定值,如CURRENT_DATE,。 所得到的結(jié)果集太大而無法將它保存到緩存中. 這兩種原因造成的結(jié)果都會增加Qcache_not_cached變量的值, 我們可以查看這個變量的值來檢查我們查詢語句的緩存情況.
2、所發(fā)送的查詢語句之前沒有發(fā)送過(***次發(fā)送), 所以也不會有什么緩存存在。
3、所發(fā)送的查詢語句的結(jié)果集之前是存在于緩存中的,但由于內(nèi)存不足,MySQL不得不將之前的一些緩存清除,以騰出空間來放置其它新的緩存結(jié)果。同樣,數(shù)據(jù)的變更也會引發(fā)緩存的失效。比如(更新,刪除,插入)。如果是數(shù)據(jù)的變量引起緩存的失效的話,我們可以通過查看Com_*變量的值來確認(rèn)有多少查詢語句更改了數(shù)據(jù),這些變量為:Com_update, Com_delete等等
關(guān)于MySQL數(shù)據(jù)庫的查詢步驟與緩存原理的知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
原文出處:http://52226777.blog.163.com/ 。
【編輯推薦】






