溫馨提示×

溫馨提示×

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

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

怎么配置MySQL緩存提高緩存命中率

發(fā)布時(shí)間:2021-09-15 13:54:53 來源:億速云 閱讀:154 作者:chen 欄目:數(shù)據(jù)庫

這篇文章主要講解了“怎么配置MySQL緩存提高緩存命中率”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么配置MySQL緩存提高緩存命中率”吧!

  一、什么時(shí)候應(yīng)用系統(tǒng)會從緩存中獲取數(shù)據(jù)?
  數(shù)據(jù)庫從服務(wù)器上讀取數(shù)據(jù)時(shí),可以從硬盤的數(shù)據(jù)文件中獲取數(shù)據(jù),也可以從數(shù)據(jù)庫緩存中讀取數(shù)據(jù)。現(xiàn)在數(shù)據(jù)庫管理員需要搞清楚的是,在什么樣的情況下,系統(tǒng)是從緩存中讀取數(shù)據(jù),而不是從硬盤的數(shù)據(jù)文件中讀取數(shù)據(jù)?
   簡單的說,數(shù)據(jù)緩存就是內(nèi)存中的一塊存儲區(qū)域,其存儲了用戶的SQL文本以及相關(guān)的查詢結(jié)果。通常情況下,用戶下次查詢時(shí),如果所使用的SQL文本是相 同的,并且自從上次查詢后,相關(guān)的紀(jì)錄沒有被更新過,此時(shí)數(shù)據(jù)庫就直接采用緩存中的內(nèi)容。從這個原則中,可以看到如果要直接使用緩存中的數(shù)據(jù),至少要滿足 以下幾個條件。
  一是所采用的SQL文本是相同的。當(dāng)前后兩次用戶使用了相同的SQL語句(假設(shè)不考慮其他條件),則服務(wù)器會從緩存中讀 取結(jié)果,而不需要再去解析和執(zhí)行SQL語句。這里需要注意的是,這里的SQL文本必須一次不差的完全相同。如果前后兩次查詢,使用了不同的查詢條件。如第 一次查詢時(shí)沒有輸入Where條件語句。后來發(fā)現(xiàn)數(shù)據(jù)量過多,利用了Where條件了過濾查詢的結(jié)果。此時(shí)即使最后的查詢結(jié)果是相同的,系統(tǒng)仍然是從數(shù)據(jù) 文件中獲取數(shù)據(jù),而不是從數(shù)據(jù)緩存中。再如,Select后面所使用的字段名稱也必須是相同的。如果有一個字段名稱不同或者前后兩次查詢所使用的字段數(shù)量 不同,則系統(tǒng)都會認(rèn)為是不同的SQL語句,而重新解析并查詢。
  二是從數(shù)據(jù)緩存的角度考慮,大小寫是不敏感的。如前后兩次查詢時(shí),采用的字段名稱可能只有大小寫的差異。如第一次使用的是大小,第二次使用的是小寫,這系統(tǒng)認(rèn)為仍然是相同的SQL語句?;蛘哒f關(guān)鍵字大小寫等等這都是不敏感的。
   三是要滿足二次查詢之間,數(shù)據(jù)記錄包括表結(jié)構(gòu)都沒有被更改過。如果記錄所在的標(biāo)更改了,如增加了一個字段等等,此時(shí)使用這個表的所有緩沖數(shù)據(jù)系統(tǒng)將自動 清空。這里需要注意,這里指的更改是一個廣義的更改,包括表中任何數(shù)據(jù)或者結(jié)果的改變。舉一個簡單的例子,第一次查詢時(shí)用戶需要查詢2010年的出貨數(shù) 據(jù)。查詢后有用戶在這個表中插入了一條2011年1月份的出貨信息。然后又有用戶需要查詢2010年的出貨信息。使用的SQL語句與第一次查詢時(shí)完全相 同。在這種情況下,數(shù)據(jù)庫系統(tǒng)會使用緩存中的數(shù)據(jù)嗎?答案是否定的。因?yàn)楫?dāng)中間用戶插入一條記錄時(shí),系統(tǒng)會自動清空跟這個表相關(guān)的所有緩存記錄。當(dāng)?shù)诙?查詢時(shí),緩存中已經(jīng)沒有這張表對應(yīng)的緩存信息。此時(shí)就需要重新解析并查詢。
  四是需要注意,默認(rèn)字符集對緩存命中率的影響。通常情況下,如果客戶端與服務(wù)器之間所采用的默認(rèn)字符集不同,則即使查詢語句相同、在兩次查詢之間記錄與表結(jié)構(gòu)也沒有被更改,系統(tǒng)仍然認(rèn)為是不同的查詢。對于這一點(diǎn)需要特別的注意,大家比較容易忽視。
  二、提高緩存命中率的建議。
  從上面的條件分析中可以看出,利用緩存中的數(shù)據(jù)具有比較嚴(yán)格的條件。其實(shí)這些條件也是合情合理的。主要是為了保障數(shù)據(jù)的一致性。對以上這些條件有深入的認(rèn)識之后,現(xiàn)在數(shù)據(jù)庫管理員需要考慮的是,如何來提高這個緩存的命中率?對此筆者有如下幾個建議。
   一是在配置時(shí),客戶端與服務(wù)器端要使用相同的字符集。如果客戶端(或者說第三方工具)與服務(wù)器端使用的字符集不同,那么任何情況下都不會使用緩存功能。 特別在國內(nèi),需要用到中文的字符集。此時(shí)特別需要注意,客戶端默認(rèn)字符集要與服務(wù)器端的默認(rèn)字符集相同。注意,這里是相同,而不是兼容。有時(shí)候即使采用了 不同的字符集,客戶端上仍然可以正常顯示。這主要是因?yàn)橛行┳址m然不相同,但是是相互兼容的。在緩存管理上,需要相同,光兼容還不行。
   二是在客戶端上,要固化查詢的語句。如現(xiàn)在有財(cái)務(wù)人員和采購人員同時(shí)從系統(tǒng)中查詢11月份的出貨數(shù)據(jù)。顯然他們崗位職責(zé)不同,所需要字段的內(nèi)容是不同 的。此時(shí)在客戶端出,可以允許用戶設(shè)置自己所需要的表單格式。但是筆者建議,后臺所采用的SQL語句最好是相同的。這里數(shù)據(jù)會經(jīng)過三個渠道:后臺數(shù)據(jù)庫、 客戶端、用戶。筆者的意識時(shí),后臺數(shù)據(jù)庫與客戶端之間的交互采用相同的SQL語句。然后客戶端與用戶之間進(jìn)行交互時(shí),根據(jù)用戶定義的格式(包括字段前后的 排列、不包括查詢條件語句的差異)向用戶顯示數(shù)據(jù)。此時(shí)由于采用了相同的SQL語句(只是用戶對于顯示格式的要求不同),從而可以提高應(yīng)用系統(tǒng)的查詢效 率。
  三是提高內(nèi)存中緩存的配置,來提高命中率。一般在服務(wù)器啟動時(shí),操作系統(tǒng)會跟數(shù)據(jù)庫軟件協(xié)商緩存空間的大小。當(dāng)緩存工作不足時(shí),緩 存中最舊的緩存記錄會被最新的消息所覆蓋??梢姡绻軌蛱岣呔彺婵臻g,就可以提高命中率。這就好像打靶,目標(biāo)多了,命中的幾率也會高許多。不過用戶的并 發(fā)數(shù)越多,這個設(shè)置的效果會越不明顯。
  四是通過分區(qū)表可以提高緩存的命中率。在上面的條件分析中,大家可以看到,只要所查詢的表中插入 了一條記錄,系統(tǒng)就會清空緩存記錄?,F(xiàn)在以查詢出貨記錄為例。出貨記錄表每天都在更新,而用戶在年初時(shí),會經(jīng)常需要查詢上一年的出貨記錄。此時(shí)由于這個表 中的數(shù)據(jù)每個小時(shí)都在更新,那么緩存中的信息會不斷的被情況。此時(shí)緩存的命中率顯然不會很高。針對這種情況,筆者建議可以采用分區(qū)表。如可以通過系統(tǒng)設(shè) 置,將2010年的出貨記錄單獨(dú)存放在一個出貨的分區(qū)表中。即每一個年度都使用一張單獨(dú)的分區(qū)表。此時(shí)2011年的紀(jì)錄,就不會影響到2010年的分區(qū) 表。此時(shí)如果用戶重復(fù)查詢2010年的出貨信息,只要其使用的SQL語句相同(沒有采用不同的查詢條件),那么就可以享受緩存機(jī)制所帶來的效益,提高應(yīng)用 系統(tǒng)的查詢效果。。
  三、多個應(yīng)用對緩存的影響。
  通常情況下,MySQL數(shù)據(jù)庫的緩存是根據(jù)服務(wù)器內(nèi)存的大小自動分配 的。如果一臺服務(wù)器上只有一個MySQL應(yīng)用,那么固然最好。不過在實(shí)際工作中,為了降低信息化投資的成本,往往會在同一臺服務(wù)器上布置多個信息化應(yīng)用。 由于其他信息化應(yīng)用也需要使用內(nèi)存的空間作為緩存,那么MySQL數(shù)據(jù)庫中緩存空間就可能變小。如果遇到這種情況下,數(shù)據(jù)庫管理員需要跟系統(tǒng)工程師進(jìn)行協(xié) 商,為各種不同的應(yīng)用根據(jù)性能要求的不同,手工設(shè)置不同的緩存空間。如此的話,就可以避免同一臺服務(wù)器上不同信息化應(yīng)用對緩存的沖突。

感謝各位的閱讀,以上就是“怎么配置MySQL緩存提高緩存命中率”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么配置MySQL緩存提高緩存命中率這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

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

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

AI