mysql緩沖和緩存設(shè)置詳解

Mysql關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)

mysql是一個(gè)開(kāi)放源碼的小型關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)發(fā)者為瑞典mysql ab公司。mysql被廣泛地應(yīng)用在internet上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了mysql作為網(wǎng)站數(shù)據(jù)庫(kù)。

本文主要給大家講解的是mysql優(yōu)化過(guò)程中比較重要的2個(gè)參數(shù)緩沖和緩存的設(shè)置,希望大家能夠喜歡

MySQL 可調(diào)節(jié)設(shè)置可以應(yīng)用于整個(gè) mysqld進(jìn)程,也可以應(yīng)用于單個(gè)客戶(hù)機(jī)會(huì)話(huà)。

服務(wù)器端的設(shè)置

每個(gè)表都可以表示為磁盤(pán)上的一個(gè)文件,必須先打開(kāi),后讀取。為了加快從文件中讀取數(shù)據(jù)的過(guò)程,mysqld對(duì)這些打開(kāi)文件進(jìn)行了緩存,其最大數(shù)目由 /etc/mysqld.conf 中的table_cache 指定。清單 4給出了顯示與打開(kāi)表有關(guān)的活動(dòng)的方式。

清單 4. 顯示打開(kāi)表的活動(dòng)

mysql>?SHOW?STATUS?LIKE?'open%tables';  +---------------+-------+  |?Variable_name?|?Value?|  +---------------+-------+  |?Open_tables??|?5000?|  |?Opened_tables?|?195??|  +---------------+-------+  2?rows?in?set?(0.00?sec)

清單 4 說(shuō)明目前有 5,000 個(gè)表是打開(kāi)的,有 195個(gè)表需要打開(kāi),因?yàn)楝F(xiàn)在緩存中已經(jīng)沒(méi)有可用文件描述符了(由于統(tǒng)計(jì)信息在前面已經(jīng)清除了,因此可能會(huì)存在 5,000 個(gè)打開(kāi)表中只有 195個(gè)打開(kāi)記錄的情況)。如果 Opened_tables 隨著重新運(yùn)行SHOW STATUS 命令快速增加,就說(shuō)明緩存命中率不夠。如果Open_tables 比table_cache設(shè)置小很多,就說(shuō)明該值太大了(不過(guò)有空間可以增長(zhǎng)總不是什么壞事)。例如,使用 table_cache =5000 可以調(diào)整表的緩存。

與表的緩存類(lèi)似,對(duì)于線(xiàn)程來(lái)說(shuō)也有一個(gè)緩存。 mysqld在接收連接時(shí)會(huì)根據(jù)需要生成線(xiàn)程。在一個(gè)連接變化很快的繁忙服務(wù)器上,對(duì)線(xiàn)程進(jìn)行緩存便于以后使用可以加快最初的連接。

清單 5 顯示如何確定是否緩存了足夠的線(xiàn)程。

清單 5. 顯示線(xiàn)程使用統(tǒng)計(jì)信息

mysql>?SHOW?STATUS?LIKE?'threads%';  +-------------------+--------+  |?Variable_name???|?Value?|  +-------------------+--------+  |?Threads_cached??|?27???|  |?Threads_connected?|?15???|  |?Threads_created??|?838610?|  |?Threads_running??|?3???|  +-------------------+--------+  4?rows?in?set?(0.00?sec)

此處重要的值是 Threads_created,每次mysqld 需要?jiǎng)?chuàng)建一個(gè)新線(xiàn)程時(shí),這個(gè)值都會(huì)增加。如果這個(gè)數(shù)字在連續(xù)執(zhí)行SHOW STATUS 命令時(shí)快速增加,就應(yīng)該嘗試增大線(xiàn)程緩存。例如,可以在my.cnf 中使用 thread_cache = 40 來(lái)實(shí)現(xiàn)此目的。

關(guān)鍵字緩沖區(qū)保存了 MyISAM 表的索引塊。理想情況下,對(duì)于這些塊的請(qǐng)求應(yīng)該來(lái)自于內(nèi)存,而不是來(lái)自于磁盤(pán)。清單 6顯示了如何確定有多少塊是從磁盤(pán)中讀取的,以及有多少塊是從內(nèi)存中讀取的。

清單 6. 確定關(guān)鍵字效率

mysql>?show?status?like?'%key_read%';  +-------------------+-----------+  |?Variable_name???|?Value???|  +-------------------+-----------+  |?Key_read_requests?|?163554268?|  |?Key_reads?????|?98247???|  +-------------------+-----------+  2?rows?in?set?(0.00?sec)

Key_reads 代表命中磁盤(pán)的請(qǐng)求個(gè)數(shù),Key_read_requests是總數(shù)。命中磁盤(pán)的讀請(qǐng)求數(shù)除以讀請(qǐng)求總數(shù)就是不中比率 —— 在本例中每 1,000 個(gè)請(qǐng)求,大約有 0.6 個(gè)沒(méi)有命中內(nèi)存。如果每1,000 個(gè)請(qǐng)求中命中磁盤(pán)的數(shù)目超過(guò) 1 個(gè),就應(yīng)該考慮增大關(guān)鍵字緩沖區(qū)了。例如,key_buffer =384M 會(huì)將緩沖區(qū)設(shè)置為 384MB。

臨時(shí)表可以在更高級(jí)的查詢(xún)中使用,其中數(shù)據(jù)在進(jìn)一步進(jìn)行處理(例如 GROUPBY字句)之前,都必須先保存到臨時(shí)表中;理想情況下,在內(nèi)存中創(chuàng)建臨時(shí)表。但是如果臨時(shí)表變得太大,就需要寫(xiě)入磁盤(pán)中。清單 7給出了與臨時(shí)表創(chuàng)建有關(guān)的統(tǒng)計(jì)信息。

清單 7. 確定臨時(shí)表的使用

mysql>?SHOW?STATUS?LIKE?'created_tmp%';  +-------------------------+-------+  |?Variable_name??????|?Value?|  +-------------------------+-------+  |?Created_tmp_disk_tables?|?30660?|  |?Created_tmp_files????|?2???|  |?Created_tmp_tables???|?32912?|  +-------------------------+-------+  3?rows?in?set?(0.00?sec)

每次使用臨時(shí)表都會(huì)增大 Created_tmp_tables;基于磁盤(pán)的表也會(huì)增大 Created_tmp_disk_tables。對(duì)于這個(gè)比率,并沒(méi)有什么嚴(yán)格的規(guī)則,因?yàn)檫@依賴(lài)于所涉及的查詢(xún)。長(zhǎng)時(shí)間觀(guān)察Created_tmp_disk_tables會(huì)顯示所創(chuàng)建的磁盤(pán)表的比率,您可以確定設(shè)置的效率。 tmp_table_size和 max_heap_table_size都可以控制臨時(shí)表的最大大小,因此請(qǐng)確保在 my.cnf 中對(duì)這兩個(gè)值都進(jìn)行了設(shè)置。

每個(gè)會(huì)話(huà) 的設(shè)置

下面這些設(shè)置針對(duì)于每個(gè)會(huì)話(huà)。在設(shè)置這些數(shù)字時(shí)要十分謹(jǐn)慎,因?yàn)樗鼈冊(cè)诔艘钥赡艽嬖诘倪B接數(shù)時(shí)候,這些選項(xiàng)表示大量的內(nèi)存!您可以通過(guò)代碼修改會(huì)話(huà)中的這些數(shù)字,或者在 my.cnf 中為所有會(huì)話(huà)修改這些設(shè)置。

當(dāng) MySQL必須要進(jìn)行排序時(shí),就會(huì)在從磁盤(pán)上讀取數(shù)據(jù)時(shí)分配一個(gè)排序緩沖區(qū)來(lái)存放這些數(shù)據(jù)行。如果要排序的數(shù)據(jù)太大,那么數(shù)據(jù)就必須保存到磁盤(pán)上的臨時(shí)文件中,并再次進(jìn)行排序。如果 sort_merge_passes狀態(tài)變量很大,這就指示了磁盤(pán)的活動(dòng)情況。清單 8 給出了一些與排序相關(guān)的狀態(tài)計(jì)數(shù)器信息。

清單 8. 顯示排序統(tǒng)計(jì)信息

mysql>?SHOW?STATUS?LIKE?"sort%";  +-------------------+---------+  |?Variable_name???|?Value??|  +-------------------+---------+  |?Sort_merge_passes?|?1????|  |?Sort_range????|?79192??|  |?Sort_rows?????|?2066532?|  |?Sort_scan?????|?44006??|  +-------------------+---------+  4?rows?in?set?(0.00?sec)

如果 sort_merge_passes 很大,就表示需要注意sort_buffer_size。例如,sort_buffer_size = 4M 將排序緩沖區(qū)設(shè)置為 4MB。

MySQL也會(huì)分配一些內(nèi)存來(lái)讀取表。理想情況下,索引提供了足夠多的信息,可以只讀入所需要的行,但是有時(shí)候查詢(xún)(設(shè)計(jì)不佳或數(shù)據(jù)本性使然)需要讀取表中大量數(shù)據(jù)。要理解這種行為,需要知道運(yùn)行了多少個(gè) SELECT語(yǔ)句,以及需要讀取表中的下一行數(shù)據(jù)的次數(shù)(而不是通過(guò)索引直接訪(fǎng)問(wèn))。實(shí)現(xiàn)這種功能的命令如清單 9 所示。

清單 9. 確定表掃描比率

mysql>?SHOW?STATUS?LIKE?"com_select";  +---------------+--------+  |?Variable_name?|?Value?|  +---------------+--------+  |?Com_select??|?318243?|  +---------------+--------+  1?row?in?set?(0.00?sec)  mysql>?SHOW?STATUS?LIKE?"handler_read_rnd_next";  +-----------------------+-----------+  |?Variable_name?????|?Value???|  +-----------------------+-----------+  |?Handler_read_rnd_next?|?165959471?|  +-----------------------+-----------+  1?row?in?set?(0.00?sec)

Handler_read_rnd_next /Com_select 得出了表掃描比率 —— 在本例中是 521:1。如果該值超過(guò)4000,就應(yīng)該查看 read_buffer_size,例如read_buffer_size = 4M。如果這個(gè)數(shù)字超過(guò)了8M,就應(yīng)該與開(kāi)發(fā)人員討論一下對(duì)這些查詢(xún)進(jìn)行調(diào)優(yōu)了!

查看數(shù)據(jù)庫(kù)緩存配置情況

mysql>?SHOW?VARIABLES?LIKE?‘%query_cache%';  +——————————+———+  |?Variable_name?|?Value?|  +——————————+———+  |?have_query_cache?|?YES?|?–查詢(xún)緩存是否可用  |?query_cache_limit?|?1048576?|?–可緩存具體查詢(xún)結(jié)果的最大值  |?query_cache_min_res_unit?|?4096?|  |?query_cache_size?|?599040?|?–查詢(xún)緩存的大小  |?query_cache_type?|?ON?|?–阻止或是支持查詢(xún)緩存  |?query_cache_wlock_invalidate?|?OFF?|  +——————————+———+

配置方法:

在MYSQL的配置文件my.ini或my.cnf中找到如下內(nèi)容:

#?Query?cache?is?used?to?cache?SELECT?results?and?later?returnthem    #?without?actual?executing?the?same?query?once?again.?Having?thequery    #?cache?enabled?may?result?in?significant?speed?improvements,?ifyour    #?have?a?lot?of?identical?queries?and?rarely?changing?tables.See?the    #?"Qcache_lowmem_prunes"?status?variable?to?check?if?the?currentvalue    #?is?high?enough?for?your?load.    #?Note:?In?case?your?tables?change?very?often?or?if?your?queriesare    #?textually?different?every?time,?the?query?cache?may?result?ina    #?slowdown?instead?of?a?performance?improvement.    query_cache_size=0

以上信息是默認(rèn)配置,其注釋意思是說(shuō),MYSQL的查詢(xún)緩存用于緩存select查詢(xún)結(jié)果,并在下次接收到同樣的查詢(xún)請(qǐng)求時(shí),不再執(zhí)行實(shí)際查詢(xún)處理而直接返回結(jié)果,有這樣的查詢(xún)緩存能提高查詢(xún)的速度,使查詢(xún)性能得到優(yōu)化,前提條件是你有大量的相同或相似的查詢(xún),而很少改變表里的數(shù)據(jù),否則沒(méi)有必要使用此功能。可以通過(guò)Qcache_lowmem_prunes變量的值來(lái)檢查是否當(dāng)前的值滿(mǎn)足你目前系統(tǒng)的負(fù)載。注意:如果你查詢(xún)的表更新比較頻繁,而且很少有相同的查詢(xún),最好不要使用查詢(xún)緩存。

具體配置方法:

1. 將query_cache_size設(shè)置為具體的大小,具體大小是多少取決于查詢(xún)的實(shí)際情況,但最好設(shè)置為1024的倍數(shù),參考值32M。

2. 增加一行:query_cache_type=1

query_cache_type參數(shù)用于控制緩存的類(lèi)型,注意這個(gè)值不能隨便設(shè)置,必須設(shè)置為數(shù)字,可選項(xiàng)目以及說(shuō)明如下:

如果設(shè)置為0,那么可以說(shuō),你的緩存根本就沒(méi)有用,相當(dāng)于禁用了。但是這種情況下query_cache_size設(shè)置的大小系統(tǒng)是否要為其分配呢,這個(gè)問(wèn)題有待于測(cè)試?

如果設(shè)置為1,將會(huì)緩存所有的結(jié)果,除非你的select語(yǔ)句使用SQL_NO_CACHE禁用了查詢(xún)緩存。

如果設(shè)置為2,則只緩存在select語(yǔ)句中通過(guò)SQL_CACHE指定需要緩存的查詢(xún)。

OK,配置完后的部分文件如下:

query_cache_size=128M    query_cache_type=1

保存文件,重新啟動(dòng)MYSQL服務(wù),然后通過(guò)如下查詢(xún)來(lái)驗(yàn)證是否真正開(kāi)啟了:

mysql>?show?variables?like?'%query_cache%';    +——————————+———–+    |?Variable_name??????|Value??|    +——————————+———–+    |?have_query_cache?????|YES???|    |?query_cache_limit?????|1048576??|    |?query_cache_min_res_unit??|4096???|    |?query_cache_size?????|?134217728|    |?query_cache_type?????|ON????|    |?query_cache_wlock_invalidate?|?OFF???|    +——————————+———–+    6?rows?in?set?(0.00?sec)

主要看query_cache_size和query_cache_type的值是否跟我們?cè)O(shè)的一致:

這里query_cache_size的值是134217728,我們?cè)O(shè)置的是128M,實(shí)際是一樣的,只是單位不同,可以自己換算下:134217728 = 128*1024*1024。

query_cache_type設(shè)置為1,顯示為ON,這個(gè)前面已經(jīng)說(shuō)過(guò)了。

總之,看到上邊的顯示表示設(shè)置正確,但是在實(shí)際的查詢(xún)中是否能夠緩存查詢(xún),還需要手動(dòng)測(cè)試下,我們可以通過(guò)show statuslike ‘%Qcache%’;語(yǔ)句來(lái)測(cè)試,現(xiàn)在我們開(kāi)啟了查詢(xún)緩存功能,在執(zhí)行查詢(xún)前,我們先看看相關(guān)參數(shù)的值:

mysql>?show?status?like?'%Qcache%';    +————————-+———–+    |?Variable_name????|Value??|    +————————-+———–+    |?Qcache_free_blocks???|1????|    |?Qcache_free_memory???|?134208800|    |?Qcache_hits?????|0????|

以上就是mysql緩沖和緩存設(shè)置詳解的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員