自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL數(shù)據(jù)庫(kù)開(kāi)發(fā)必備常識(shí)

數(shù)據(jù)庫(kù) MySQL
MySQL數(shù)據(jù)庫(kù)是開(kāi)放源代碼,雖然功能未必很強(qiáng)大,但因?yàn)樗拈_(kāi)源、廣泛傳播,導(dǎo)致很多人都了解到這個(gè)數(shù)據(jù)庫(kù)。MySQL數(shù)據(jù)庫(kù)的開(kāi)發(fā)在MySQL數(shù)據(jù)庫(kù)發(fā)展歷程中也是很重要的,本文介紹MySQL數(shù)據(jù)庫(kù)開(kāi)發(fā)必備常識(shí)。

導(dǎo)讀:眾所周知,系統(tǒng)讀取數(shù)據(jù)時(shí),從內(nèi)存中讀取要比從硬盤(pán)上速度要快好幾百倍。故現(xiàn)在絕大部分應(yīng)用系統(tǒng),都會(huì)最大程度的使用緩存(內(nèi)存中的一個(gè)存儲(chǔ)區(qū)域),來(lái)提高系統(tǒng)的運(yùn)行效率。MySQL數(shù)據(jù)庫(kù)也不例外。在這里,筆者將結(jié)合自己的工作經(jīng)驗(yàn),跟大家探討一下,MySQL數(shù)據(jù)庫(kù)中緩存的管理技巧:如何合理配置MySQL數(shù)據(jù)庫(kù)緩存,提高緩存命中率。

 

一、什么時(shí)候應(yīng)用系統(tǒng)會(huì)從緩存中獲取數(shù)據(jù)?

  數(shù)據(jù)庫(kù)從服務(wù)器上讀取數(shù)據(jù)時(shí),可以從硬盤(pán)的數(shù)據(jù)文件中獲取數(shù)據(jù),也可以從數(shù)據(jù)庫(kù)緩存中讀取數(shù)據(jù)。現(xiàn)在數(shù)據(jù)庫(kù)管理員需要搞清楚的是,在什么樣的情況下,系統(tǒng)是從緩存中讀取數(shù)據(jù),而不是從硬盤(pán)的數(shù)據(jù)文件中讀取數(shù)據(jù)?

  簡(jiǎn)單的說(shuō),數(shù)據(jù)緩存就是內(nèi)存中的一塊存儲(chǔ)區(qū)域,其存儲(chǔ)了用戶(hù)的SQL文本以及相關(guān)的查詢(xún)結(jié)果。通常情況下,用戶(hù)下次查詢(xún)時(shí),如果所使用的SQL文本是相同的,并且自從上次查詢(xún)后,相關(guān)的紀(jì)錄沒(méi)有被更新過(guò),此時(shí)數(shù)據(jù)庫(kù)就直接采用緩存中的內(nèi)容。從這個(gè)原則中,可以看到如果要直接使用緩存中的數(shù)據(jù),至少要滿(mǎn)足以下幾個(gè)條件。

  一是所采用的SQL文本是相同的。當(dāng)前后兩次用戶(hù)使用了相同的SQL語(yǔ)句(假設(shè)不考慮其他條件),則服務(wù)器會(huì)從緩存中讀取結(jié)果,而不需要再去解析和執(zhí)行SQL語(yǔ)句。這里需要注意的是,這里的SQL文本必須一次不差的完全相同。如果前后兩次查詢(xún),使用了不同的查詢(xún)條件。如第一次查詢(xún)時(shí)沒(méi)有輸入Where條件語(yǔ)句。后來(lái)發(fā)現(xiàn)數(shù)據(jù)量過(guò)多,利用了Where條件了過(guò)濾查詢(xún)的結(jié)果。此時(shí)即使最后的查詢(xún)結(jié)果是相同的,系統(tǒng)仍然是從數(shù)據(jù)文件中獲取數(shù)據(jù),而不是從數(shù)據(jù)緩存中。再如,Select后面所使用的字段名稱(chēng)也必須是相同的。如果有一個(gè)字段名稱(chēng)不同或者前后兩次查詢(xún)所使用的字段數(shù)量不同,則系統(tǒng)都會(huì)認(rèn)為是不同的SQL語(yǔ)句,而重新解析并查詢(xún)。

  二是從數(shù)據(jù)緩存的角度考慮,大小寫(xiě)是不敏感的。如前后兩次查詢(xún)時(shí),采用的字段名稱(chēng)可能只有大小寫(xiě)的差異。如第一次使用的是大小,第二次使用的是小寫(xiě),這系統(tǒng)認(rèn)為仍然是相同的SQL語(yǔ)句。或者說(shuō)關(guān)鍵字大小寫(xiě)等等這都是不敏感的。

  三是要滿(mǎn)足二次查詢(xún)之間,數(shù)據(jù)記錄包括表結(jié)構(gòu)都沒(méi)有被更改過(guò)。如果記錄所在的標(biāo)更改了,如增加了一個(gè)字段等等,此時(shí)使用這個(gè)表的所有緩沖數(shù)據(jù)系統(tǒng)將自動(dòng)清空。這里需要注意,這里指的更改是一個(gè)廣義的更改,包括表中任何數(shù)據(jù)或者結(jié)果的改變。舉一個(gè)簡(jiǎn)單的例子,第一次查詢(xún)時(shí)用戶(hù)需要查詢(xún)2010年的出貨數(shù)據(jù)。查詢(xún)后有用戶(hù)在這個(gè)表中插入了一條2011年1月份的出貨信息。然后又有用戶(hù)需要查詢(xún)2010年的出貨信息。使用的SQL語(yǔ)句與第一次查詢(xún)時(shí)完全相同。在這種情況下,數(shù)據(jù)庫(kù)系統(tǒng)會(huì)使用緩存中的數(shù)據(jù)嗎?答案是否定的。因?yàn)楫?dāng)中間用戶(hù)插入一條記錄時(shí),系統(tǒng)會(huì)自動(dòng)清空跟這個(gè)表相關(guān)的所有緩存記錄。當(dāng)?shù)诙尾樵?xún)時(shí),緩存中已經(jīng)沒(méi)有這張表對(duì)應(yīng)的緩存信息。此時(shí)就需要重新解析并查詢(xún)。

  四是需要注意,默認(rèn)字符集對(duì)緩存命中率的影響。通常情況下,如果客戶(hù)端與服務(wù)器之間所采用的默認(rèn)字符集不同,則即使查詢(xún)語(yǔ)句相同、在兩次查詢(xún)之間記錄與表結(jié)構(gòu)也沒(méi)有被更改,系統(tǒng)仍然認(rèn)為是不同的查詢(xún)。對(duì)于這一點(diǎn)需要特別的注意,大家比較容易忽視。

二、提高緩存命中率的建議。

  從上面的條件分析中可以看出,利用緩存中的數(shù)據(jù)具有比較嚴(yán)格的條件。其實(shí)這些條件也是合情合理的。主要是為了保障數(shù)據(jù)的一致性。對(duì)以上這些條件有深入的認(rèn)識(shí)之后,現(xiàn)在數(shù)據(jù)庫(kù)管理員需要考慮的是,如何來(lái)提高這個(gè)緩存的命中率?對(duì)此筆者有如下幾個(gè)建議。

  一是在配置時(shí),客戶(hù)端與服務(wù)器端要使用相同的字符集。如果客戶(hù)端(或者說(shuō)第三方工具)與服務(wù)器端使用的字符集不同,那么任何情況下都不會(huì)使用緩存功能。特別在國(guó)內(nèi),需要用到中文的字符集。此時(shí)特別需要注意,客戶(hù)端默認(rèn)字符集要與服務(wù)器端的默認(rèn)字符集相同。注意,這里是相同,而不是兼容。有時(shí)候即使采用了不同的字符集,客戶(hù)端上仍然可以正常顯示。這主要是因?yàn)橛行┳址m然不相同,但是是相互兼容的。在緩存管理上,需要相同,光兼容還不行。

  二是在客戶(hù)端上,要固化查詢(xún)的語(yǔ)句。如現(xiàn)在有財(cái)務(wù)人員和采購(gòu)人員同時(shí)從系統(tǒng)中查詢(xún)11月份的出貨數(shù)據(jù)。顯然他們崗位職責(zé)不同,所需要字段的內(nèi)容是不同的。此時(shí)在客戶(hù)端出,可以允許用戶(hù)設(shè)置自己所需要的表單格式。但是筆者建議,后臺(tái)所采用的SQL語(yǔ)句最好是相同的。這里數(shù)據(jù)會(huì)經(jīng)過(guò)三個(gè)渠道:后臺(tái)數(shù)據(jù)庫(kù)、客戶(hù)端、用戶(hù)。筆者的意識(shí)時(shí),后臺(tái)數(shù)據(jù)庫(kù)與客戶(hù)端之間的交互采用相同的SQL語(yǔ)句。然后客戶(hù)端與用戶(hù)之間進(jìn)行交互時(shí),根據(jù)用戶(hù)定義的格式(包括字段前后的排列、不包括查詢(xún)條件語(yǔ)句的差異)向用戶(hù)顯示數(shù)據(jù)。此時(shí)由于采用了相同的SQL語(yǔ)句(只是用戶(hù)對(duì)于顯示格式的要求不同),從而可以提高應(yīng)用系統(tǒng)的查詢(xún)效率。

  三是提高內(nèi)存中緩存的配置,來(lái)提高命中率。一般在服務(wù)器啟動(dòng)時(shí),操作系統(tǒng)會(huì)跟數(shù)據(jù)庫(kù)軟件協(xié)商緩存空間的大小。當(dāng)緩存工作不足時(shí),緩存中最舊的緩存記錄會(huì)被最新的消息所覆蓋。可見(jiàn),如果能夠提高緩存空間,就可以提高命中率。這就好像打靶,目標(biāo)多了,命中的幾率也會(huì)高許多。不過(guò)用戶(hù)的并發(fā)數(shù)越多,這個(gè)設(shè)置的效果會(huì)越不明顯。

  四是通過(guò)分區(qū)表可以提高緩存的命中率。在上面的條件分析中,大家可以看到,只要所查詢(xún)的表中插入了一條記錄,系統(tǒng)就會(huì)清空緩存記錄。現(xiàn)在以查詢(xún)出貨記錄為例。出貨記錄表每天都在更新,而用戶(hù)在年初時(shí),會(huì)經(jīng)常需要查詢(xún)上一年的出貨記錄。此時(shí)由于這個(gè)表中的數(shù)據(jù)每個(gè)小時(shí)都在更新,那么緩存中的信息會(huì)不斷的被情況。此時(shí)緩存的命中率顯然不會(huì)很高。針對(duì)這種情況,筆者建議可以采用分區(qū)表。如可以通過(guò)系統(tǒng)設(shè)置,將2010年的出貨記錄單獨(dú)存放在一個(gè)出貨的分區(qū)表中。即每一個(gè)年度都使用一張單獨(dú)的分區(qū)表。此時(shí)2011年的紀(jì)錄,就不會(huì)影響到2010年的分區(qū)表。此時(shí)如果用戶(hù)重復(fù)查詢(xún)2010年的出貨信息,只要其使用的SQL語(yǔ)句相同(沒(méi)有采用不同的查詢(xún)條件),那么就可以享受緩存機(jī)制所帶來(lái)的效益,提高應(yīng)用系統(tǒng)的查詢(xún)效果。。

三、多個(gè)應(yīng)用對(duì)緩存的影響。

  通常情況下,MySQL數(shù)據(jù)庫(kù)的緩存是根據(jù)服務(wù)器內(nèi)存的大小自動(dòng)分配的。如果一臺(tái)服務(wù)器上只有一個(gè)MySQL應(yīng)用,那么固然最好。不過(guò)在實(shí)際工作中,為了降低信息化投資的成本,往往會(huì)在同一臺(tái)服務(wù)器上布置多個(gè)信息化應(yīng)用。由于其他信息化應(yīng)用也需要使用內(nèi)存的空間作為緩存,那么MySQL數(shù)據(jù)庫(kù)中緩存空間就可能變小。如果遇到這種情況下,數(shù)據(jù)庫(kù)管理員需要跟系統(tǒng)工程師進(jìn)行協(xié)商,為各種不同的應(yīng)用根據(jù)性能要求的不同,手工設(shè)置不同的緩存空間。如此的話(huà),就可以避免同一臺(tái)服務(wù)器上不同信息化應(yīng)用對(duì)緩存的沖突。
 

這些知識(shí)對(duì)剛?cè)腴T(mén)的初學(xué)者是很有意義的,上文講到的都是程序員基礎(chǔ),踏踏實(shí)實(shí)從基礎(chǔ)學(xué)起,對(duì)以后的發(fā)展是有好處的,很高興能與大家一起分享這些知識(shí),真心的希望能夠幫到大家。

【編輯推薦】

  1. 不使用MySQL數(shù)據(jù)庫(kù)的五個(gè)給力理由
  2. MySQL數(shù)據(jù)庫(kù)引擎快速指導(dǎo)
  3. MySQL數(shù)據(jù)庫(kù)的23個(gè)特別注意的安全事項(xiàng)
責(zé)任編輯:迎迎 來(lái)源: it168網(wǎng)站
相關(guān)推薦

2010-05-18 10:34:29

MySQL數(shù)據(jù)庫(kù)備份

2011-04-07 12:52:05

Oracle數(shù)據(jù)庫(kù)

2011-02-25 15:31:19

MySQL數(shù)據(jù)庫(kù)DBA

2020-07-28 07:53:36

MySQL數(shù)據(jù)庫(kù)技術(shù)

2016-08-29 23:00:29

大數(shù)據(jù)數(shù)據(jù)分析

2011-04-07 15:02:02

LinuxMySQL數(shù)據(jù)庫(kù)

2019-04-25 15:35:37

MySQL數(shù)據(jù)庫(kù)運(yùn)維Linux

2010-05-17 16:10:39

MySQL數(shù)據(jù)庫(kù)

2011-03-10 13:19:47

Oracle數(shù)據(jù)庫(kù)

2020-12-28 09:36:53

MySQL數(shù)據(jù)庫(kù)工具

2016-09-18 21:02:47

mysql數(shù)據(jù)庫(kù)

2018-01-31 17:50:33

數(shù)據(jù)庫(kù)MySQL優(yōu)化

2009-07-28 14:16:31

ASP.NET與MyS

2011-03-03 17:56:52

MySQL數(shù)據(jù)庫(kù)優(yōu)化

2011-05-13 09:42:21

2021-10-28 19:28:04

數(shù)據(jù)庫(kù)開(kāi)發(fā)Spring

2011-03-08 08:49:55

MySQL優(yōu)化單機(jī)

2009-05-08 09:56:37

MaxDBMySQL數(shù)據(jù)庫(kù)管理

2010-05-26 09:44:41

MySQL數(shù)據(jù)庫(kù)使用

2013-01-04 10:00:12

MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)查詢(xún)優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)