轉(zhuǎn):MySQL性能優(yōu)化配置參數(shù)之thread_cache和table_cache詳解

http://www.jb51.net/article/51828.htm
一、THREAD_CACHE

十年的惠安網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整惠安建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“惠安網(wǎng)站設(shè)計(jì)”,“惠安網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

MySQL里面為了提高客戶端請(qǐng)求創(chuàng)建連接過(guò)程的性能,提供了一個(gè)連接池也就是 Thread_Cache池,將空閑的連接線程放在連接池中,而不是立即銷毀.這樣的好處就是,當(dāng)又有一個(gè)新的請(qǐng)求的時(shí)候,mysql不會(huì)立即去創(chuàng)建連接 線程,而是先去Thread_Cache中去查找空閑的連接線程,如果存在則直接使用,不存在才創(chuàng)建新的連接線程.

有關(guān)Thread_Cache在MySQL有幾個(gè)重要的參數(shù),簡(jiǎn)單介紹如下:

thread_cache_size

Thread_Cache 中存放的最大連接線程數(shù).在短連接的應(yīng)用中Thread_Cache的功效非常明顯,因?yàn)樵趹?yīng)用中數(shù)據(jù)庫(kù)的連接和創(chuàng)建是非常頻繁的,如果不使用 Thread_Cache那么消耗的資源是非常可觀的!在長(zhǎng)連接中雖然帶來(lái)的改善沒(méi)有短連接的那么明顯,但是好處是顯而易見(jiàn)的.但并不是越大越好大了反而 浪費(fèi)資源這個(gè)的確定一般認(rèn)為和物理內(nèi)存有一定關(guān)系,如下:

復(fù)制代碼代碼如下:

1G —> 8
2G —> 16
3G —> 32
>3G —> 64

如果短連接多的話可以適當(dāng)加大.

thread_stack

每個(gè)連接被創(chuàng)建的時(shí)候,mysql分配給它的內(nèi)存.這個(gè)值一般認(rèn)為默認(rèn)就可以應(yīng)用于大部分場(chǎng)景了,除非必要非則不要?jiǎng)铀?

thread_handing

運(yùn)用Thread_Cache處理連接的方式,5.1.19添加的新特性.有兩個(gè)值可選[no-threads|one-thread-per-connection] 看字面意思大家也該猜出八九分了,呵呵,no-threads 服務(wù)器使用一個(gè)線程,one-thread-per-connection 服務(wù)器為每個(gè)客戶端請(qǐng)求使用一個(gè)線程.原手冊(cè)中提到,no-threads是在Linux下調(diào)試用的.

復(fù)制代碼代碼如下:

mysql> show variables like 'thread%';
+——————-+—————————+
| Variable_name     | Value                     |
+——————-+—————————+
| thread_cache_size | 32                        |
| thread_handling   | one-thread-per-connection |
| thread_stack      | 196608                    |
+——————-+—————————+
3 rows in set (0.01 sec)


mysql> show status like '%connections%';
+———————-+——–+
| Variable_name        | Value  |
+———————-+——–+
| Connections          | 199156 |
| Max_used_connections | 31     |
+———————-+——–+
2 rows in set (0.00 sec)

mysql> show status like '%thread%';
+————————+——–+
| Variable_name          | Value  |
+————————+——–+
| Delayed_insert_threads | 0      |
| Slow_launch_threads    | 0      |
| Threads_cached         | 3      |
| Threads_connected      | 6      |
| Threads_created        | 8689   |
| Threads_running        | 5      |
+————————+——–+
6 rows in set (0.00 sec)


通過(guò)以上3個(gè)命令,可以看到服務(wù)器的 thread_cache池中最多可以存放32個(gè)連接線程,為每個(gè)客戶端球使用一個(gè)線程.為每個(gè)連接的線程分配192k的內(nèi)存空間.

服 務(wù)器總共有199156次連接,最大并發(fā)連接數(shù)為31,當(dāng)前在thread_cashe池中的連接數(shù)為3個(gè),連接數(shù)為6個(gè),處于活躍狀態(tài)的有5個(gè),共創(chuàng)建 了8689次連接.顯然這里以短連接為主.可以算出thread_cache命中率,公式為:

復(fù)制代碼代碼如下:

Thread_Cache_Hit=(Connections-Thread_created)/Connections*100%

當(dāng)前服務(wù)器的Thread_cache命中率約為95.6%這個(gè)結(jié)果我還是比較滿意的.但是可以看出 thread_cache_size有點(diǎn)多余改成16或8更合理一些.

二、TABLE_CACHE(5.1.3及以后 版本又名TABLE_OPEN_CACHE)

由于MySQL是多線程的機(jī)制,為了提高性能,每個(gè)線程都是獨(dú)自打開(kāi)自己需要的表的文件描 述符,而不是通過(guò)共享已經(jīng)打開(kāi)的.針對(duì)不同存儲(chǔ)引擎處理的方法當(dāng)然也不一樣.

在myisam表引擎中,數(shù)據(jù)文件的描述符 (descriptor)是不共享的,但是索引文件的描述符卻是所有線程共享的.Innodb中和使用表空間類型有關(guān),假如是共享表空間那么實(shí)際就一個(gè)數(shù) 據(jù)文件,當(dāng)然占用的數(shù)據(jù)文件描述符就會(huì)比獨(dú)立表空間少.

個(gè)人感覺(jué)有點(diǎn)像php里面的fopen打開(kāi)一個(gè)連接,操作完數(shù)據(jù)之后,并不立即 關(guān)閉,而是緩存起來(lái),等待下一個(gè)連接這個(gè)文件的請(qǐng)求就不必去重新打開(kāi)文件了,不知樣理解對(duì)不對(duì),哈.

手冊(cè)上有段關(guān)于打開(kāi)表時(shí)的描述:

復(fù)制代碼代碼如下:

A MyISAM table is opened for each concurrent access. This means the table needs to be opened twice if two threads access the same table or if a thread accesses the table twice in the same query (for example, by joining the table to itself). Each concurrent open requires an entry in the table cache. The first open of any MyISAM table takes two file descriptors: one for the data file and one for the index file. Each additional use of the table takes only one file descriptor for the data file. The index file descriptor is shared among all threads.

如果你正用 HANDLER tbl_name OPEN語(yǔ)句打開(kāi)一個(gè)表,將為該線程專門分配一個(gè)表。該表不被其它線程共享,只有線程調(diào)用HANDLER tbl_name CLOSE或線程終止后才被關(guān)閉。表關(guān)閉后,被拉回表緩存中(如果緩存不滿)。

mysql手冊(cè)上給的建議大小 是:table_cache=max_connections*n

n表示查詢語(yǔ)句中最大表數(shù), 還需要為臨時(shí)表和文件保留一些額外的文件描述符。

這個(gè)數(shù)據(jù)遭到很多質(zhì)疑,table_cache夠用就好,檢查 Opened_tables值,如果這個(gè)值很大,或增長(zhǎng)很快那么你就得考慮加大table_cache了.

在下面的條件下,未使用的表 將被關(guān)閉并從表緩存中移出:

當(dāng)緩存滿了并且一個(gè)線程試圖打開(kāi)一個(gè)不在緩存中的表時(shí)。

當(dāng)緩存包含超過(guò)table_cache個(gè)條目,并且緩存中的表不再被任何線程使用。

當(dāng)表刷新操作發(fā)生。當(dāng)執(zhí)行FLUSH TABLES語(yǔ)句或執(zhí)行mysqladmin flush-tables或mysqladmin refresh命令時(shí)會(huì)發(fā)生。

當(dāng)表緩存滿時(shí),服務(wù)器使用下列過(guò)程找到一個(gè)緩存入口來(lái)使用:

當(dāng)前未使用的表被釋放,以最近最少使用順序。

如果緩存滿了并且沒(méi)有表可以釋放,但是一個(gè)新表需要打開(kāi),緩存必須臨時(shí)被擴(kuò)大。

如果緩存處于一個(gè)臨時(shí)擴(kuò)大狀態(tài)并且一個(gè)表從在用變?yōu)椴辉谟脿顟B(tài),它被關(guān)閉并從緩存中釋放。

幾個(gè)關(guān)于table_cache的 狀態(tài)值:

1. table_cache:所有線程打開(kāi)的表的數(shù)目。增大該值可以增加mysqld需要的文件描述符的數(shù)量。默認(rèn)值是64.

2. open_tables:當(dāng)前打開(kāi)的表的數(shù)量.

3. opened_tables :Number of table cache misses,如果opened_tables較大,table_cache 值可能太小.

4. Open_table_definitions : The number of cached .frm files. This variable was added in MySQL 5.1.3.

5. Opened_table_definitions : The number of .frm files that have been cached. This variable was added in MySQL 5.1.24.

新聞名稱:轉(zhuǎn):MySQL性能優(yōu)化配置參數(shù)之thread_cache和table_cache詳解
當(dāng)前網(wǎng)址:http://bm7419.com/article28/gihgcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、定制開(kāi)發(fā)品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站制作企業(yè)建站動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管