mysql配置以及性能优化(转)
MySQL配置文件my.cnf中文詳解,附mysql性能優(yōu)化方法分享
=================================================================================================
Mysql參數(shù)優(yōu)化對(duì)于新手來(lái)講,是比較難懂的東西,其實(shí)這個(gè)參數(shù)優(yōu)化,是個(gè)很復(fù)雜的東西,對(duì)于不同的網(wǎng)站,及其在線(xiàn)量,訪(fǎng)問(wèn)量,帖子數(shù)量,網(wǎng)絡(luò)情況,以及機(jī)器硬件配置都有關(guān)系,優(yōu)化不可能一次性完成,需要不斷的觀(guān)察以及調(diào)試,才有可能得到最佳效果。
下面先說(shuō)我的服務(wù)器的硬件以及論壇情況,
CPU: 2顆四核Intel Xeon 2.00GHz
內(nèi)存: 4GB DDR
硬盤(pán): SCSI 146GB
論壇:在線(xiàn)會(huì)員 一般在 5000 人左右 – 最高記錄是 13264.
下面,我們根據(jù)以上硬件配置結(jié)合一份已經(jīng)做過(guò)一次優(yōu)化的my.cnf進(jìn)行分析說(shuō)明:有些參數(shù)可能還得根據(jù)論壇的變化情況以及程序員的程序進(jìn)行再調(diào)整。
[mysqld]
port?= 3306
serverid?= 1
socket?= /tmp/mysql.sock
skip-locking?# 避免MySQL的外部鎖定,減少出錯(cuò)幾率增強(qiáng)穩(wěn)定性。
?skip-name-resolve
禁止MySQL對(duì)外部連接進(jìn)行DNS解析,使用這一選項(xiàng)可以消除MySQL進(jìn)行DNS解析的時(shí)間。但需要注意,如果開(kāi)啟該選項(xiàng),則所有遠(yuǎn)程主機(jī)連接授權(quán)都要使用IP地址方式,否則MySQL將無(wú)法正常處理連接請(qǐng)求!
back_log = 500
要求 MySQL 能有的連接數(shù)量。當(dāng)主要MySQL線(xiàn)程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請(qǐng)求,這就起作用,然后主線(xiàn)程花些時(shí)間(盡管很短)檢查連接并且啟動(dòng)一個(gè)新線(xiàn)程。
back_log值指出在MySQL暫時(shí)停止回答新請(qǐng)求之前的短時(shí)間內(nèi)多少個(gè)請(qǐng)求可以被存在堆棧中。只有如果期望在一個(gè)短時(shí)間內(nèi)有很多連接,你需要增加它,換句話(huà)說(shuō),這值對(duì)到來(lái)的TCP/IP連接的偵聽(tīng)隊(duì)列的大小。你的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制。試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無(wú)效的。當(dāng)你觀(guān)察你的主機(jī)進(jìn)程列表,發(fā)現(xiàn)大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進(jìn)程時(shí),就要加大 back_log 的值了。默認(rèn)數(shù)值是50,我把它改為500。
key_buffer_size?= 384M
# key_buffer_size指定用于索引的緩沖區(qū)大小,增加它可得到更好處理的索引(對(duì)所有讀和多重寫(xiě)),到你能負(fù)擔(dān)得起那樣多。如果你使它太大,系統(tǒng)將開(kāi)始換頁(yè)并且真的變慢了。對(duì)于內(nèi)存在4GB左右的服務(wù)器該參數(shù)可設(shè)置為384M或512M。通過(guò)檢查狀態(tài)值Key_read_requests和 Key_reads,可以知道key_buffer_size設(shè)置是否合理。比例key_reads / key_read_requests應(yīng)該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%'獲得)。注意:該參數(shù)值設(shè)置的過(guò)大反而會(huì)是服務(wù)器整體效率降低!
max_allowed_packet?= 32M
增加該變量的值十分安全,這是因?yàn)閮H當(dāng)需要時(shí)才會(huì)分配額外內(nèi)存。例如,僅當(dāng)你發(fā)出長(zhǎng)查詢(xún)或mysqld必須返回大的結(jié)果行時(shí)mysqld才會(huì)分配更多內(nèi)存。該變量之所以取較小默認(rèn)值是一種預(yù)防措施,以捕獲客戶(hù)端和服務(wù)器之間的錯(cuò)誤信息包,并確保不會(huì)因偶然使用大的信息包而導(dǎo)致內(nèi)存溢出。
table_cache?= 512(5.1之后叫做table_open_cache)
table_cache指定表高速緩存的大小。每當(dāng)MySQL訪(fǎng)問(wèn)一個(gè)表時(shí),如果在表緩沖區(qū)中還有空間,該表就被打開(kāi)并放入其中,這樣可以更快地訪(fǎng)問(wèn)表內(nèi)容。通過(guò)檢查峰值時(shí)間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現(xiàn) open_tables等于table_cache,并且opened_tables在不斷增長(zhǎng),那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables'獲得)。注意,不能盲目地把table_cache設(shè)置成很大的值。如果設(shè)置得太高,可能會(huì)造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。
sort_buffer_size?= 4M
查詢(xún)排序時(shí)所能使用的緩沖區(qū)大小。注意:該參數(shù)對(duì)應(yīng)的分配內(nèi)存是每連接獨(dú)占!如果有100個(gè)連接,那么實(shí)際分配的總共排序緩沖區(qū)大小為100 × 4 = 400MB。所以,對(duì)于內(nèi)存在4GB左右的服務(wù)器推薦設(shè)置為4-8M。
read_buffer_size?= 4M
讀查詢(xún)操作所能使用的緩沖區(qū)大小。和sort_buffer_size一樣,該參數(shù)對(duì)應(yīng)的分配內(nèi)存也是每連接獨(dú)享!
join_buffer_size?= 8M
聯(lián)合查詢(xún)操作所能使用的緩沖區(qū)大小,和sort_buffer_size一樣,該參數(shù)對(duì)應(yīng)的分配內(nèi)存也是每連接獨(dú)享!
myisam_sort_buffer_size?= 64M
MyISAM表發(fā)生變化時(shí)重新排序所需的緩沖
query_cache_size?= 64M
指定MySQL查詢(xún)緩沖區(qū)的大小。可以通過(guò)在MySQL控制臺(tái)執(zhí)行以下命令觀(guān)察:
# > SHOW VARIABLES LIKE ‘%query_cache%'; # > SHOW STATUS LIKE ‘Qcache%'; # 如果Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況;
如果Qcache_hits的值非常大,則表明查詢(xún)緩沖使用非常頻繁,如果該值較小反而會(huì)影響效率,那么可以考慮不用查詢(xún)緩沖;Qcache_free_blocks,如果該值非常大,則表明緩沖區(qū)中碎片很多。
thread_cache_size?= 64
可以復(fù)用的保存在中的線(xiàn)程的數(shù)量。如果有,新的線(xiàn)程從緩存中取得,當(dāng)斷開(kāi)連接的時(shí)候如果有空間,客戶(hù)的線(xiàn)置在緩存中。如果有很多新的線(xiàn)程,為了提高性能可以提高這個(gè)變量值。通過(guò)比較 Connections 和 Threads_created 狀態(tài)的變量,可以看到這個(gè)變量的作用
tmp_table_size?= 256M
max_connections?= 1000
指定MySQL允許的最大連接進(jìn)程數(shù)。如果在訪(fǎng)問(wèn)論壇時(shí)經(jīng)常出現(xiàn)Too Many Connections的錯(cuò)誤提示,則需要增大該參數(shù)值。
max_connect_errors = 10000000
對(duì)于同一主機(jī),如果有超出該參數(shù)值個(gè)數(shù)的中斷錯(cuò)誤連接,則該主機(jī)將被禁止連接。如需對(duì)該主機(jī)進(jìn)行解禁,執(zhí)行:FLUSH HOST;。
wait_timeout?= 10
指定一個(gè)請(qǐng)求的最大連接時(shí)間,對(duì)于4GB左右內(nèi)存的服務(wù)器可以設(shè)置為5-10。
thread_concurrency?= 8
該參數(shù)取值為服務(wù)器邏輯CPU數(shù)量×2,在本例中,服務(wù)器有2顆物理CPU,而每顆物理CPU又支持H.T超線(xiàn)程,所以實(shí)際取值為4 × 2 = 8
skip-networking
開(kāi)啟該選項(xiàng)可以徹底關(guān)閉MySQL的TCP/IP連接方式,如果WEB服務(wù)器是以遠(yuǎn)程連接的方式訪(fǎng)問(wèn)MySQL數(shù)據(jù)庫(kù)服務(wù)器則不要開(kāi)啟該選項(xiàng)!否則將無(wú)法正常連接!
long_query_time?= 10
log-slow-queries?=
log-queries-not-using-indexes
開(kāi)啟慢查詢(xún)?nèi)罩? slow query log )
慢查詢(xún)?nèi)罩緦?duì)于跟蹤有問(wèn)題的查詢(xún)非常有用。它記錄所有超過(guò)過(guò)long_query_time的查詢(xún),如果需要,還可以記錄不使用索引的記錄。下面是一個(gè)慢查詢(xún)?nèi)罩镜睦?#xff1a;
開(kāi)啟慢查詢(xún)?nèi)罩?#xff0c;需要設(shè)置參數(shù)log_slow_queries、long_query_times、log-queries-not-using-indexes。
log_slow_queries指定日志文件,如果不提供文件名,MySQL將自己產(chǎn)生缺省文件名。long_query_times指定慢查詢(xún)的閾值,缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的參數(shù),它指示記錄不使用索引的查詢(xún)。設(shè)置 long_query_time=10
外附上使用show status命令查看mysql狀態(tài)相關(guān)的值及其含義:
使用show status命令
含義如下:
aborted_clients 客戶(hù)端非法中斷連接次數(shù)
aborted_connects 連接mysql失敗次數(shù)
com_xxx xxx命令執(zhí)行次數(shù),有很多條
connections 連接mysql的數(shù)量
Created_tmp_disk_tables 在磁盤(pán)上創(chuàng)建的臨時(shí)表
Created_tmp_tables 在內(nèi)存里創(chuàng)建的臨時(shí)表
Created_tmp_files 臨時(shí)文件數(shù)
Key_read_requests The number of requests to read a key block from the cache
Key_reads The number of physical reads of a key block from disk
Max_used_connections 同時(shí)使用的連接數(shù)
Open_tables 開(kāi)放的表
Open_files 開(kāi)放的文件
Opened_tables 打開(kāi)的表
Questions 提交到server的查詢(xún)數(shù)
Sort_merge_passes 如果這個(gè)值很大,應(yīng)該增加my.cnf中的sort_buffer值
Uptime 服務(wù)器已經(jīng)工作的秒數(shù)
提升性能的建議:
1.如果opened_tables太大,應(yīng)該把my.cnf中的table_cache變大
2.如果Key_reads太大,則應(yīng)該把my.cnf中key_buffer_size變大.可以用Key_reads/Key_read_requests計(jì)算出cache失敗率
3.如果Handler_read_rnd太大,則你寫(xiě)的SQL語(yǔ)句里很多查詢(xún)都是要掃描整個(gè)表,而沒(méi)有發(fā)揮索引的鍵的作用
4.如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections計(jì)算cache命中率
5.如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于內(nèi)存的臨時(shí)表代替基于磁盤(pán)的
==========================================================================================================
存儲(chǔ)引擎是什么?MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或者內(nèi) 正確的編譯方法固然重要,但它只是提高M(jìn)ySQL服務(wù)器性能工作的一部分。MySQL服務(wù)器的許多參數(shù)會(huì)影響服務(wù)器的性能表現(xiàn),而且我們可以把這些參數(shù)保存到配置文件,使得每次MySQL服務(wù)器啟動(dòng)時(shí)這些參數(shù)都自動(dòng)發(fā)揮作用。這個(gè)配置文件就是my.cnf。
MySQL服務(wù)器提供了my.cnf文件的幾個(gè)示例,它們可以在/usr/local/mysql/share/mysql/目錄下找到,名字分別為 my-small.cnf、my-medium.cnf、my-large.cnf以及my-huge.cnf。文件名字中關(guān)于規(guī)模的說(shuō)明描述了該配置文件適用的系統(tǒng)類(lèi)型。例如,如果運(yùn)行MySQL服務(wù)器的系統(tǒng)內(nèi)存不多,而且MySQL只是偶爾使用,那么使用my-small.cnf配置文件最為理想,這個(gè)配置文件告訴mysqld daemon使用最少的系統(tǒng)資源。反之,如果MySQL服務(wù)器用于支持一個(gè)大規(guī)模的在線(xiàn)商場(chǎng),系統(tǒng)擁有2G的內(nèi)存,那么使用mysql-huge.cnf 最為合適。
要使用上述示例配置文件,我們應(yīng)該先復(fù)制一個(gè)最適合要求的配置文件,并把它命名為my.cnf。這個(gè)復(fù)制得到的配置文件可以按照如下三種方式使用:
全局:把這個(gè)my.cnf文件復(fù)制到服務(wù)器的/etc目錄,此時(shí)文件中所定義的參數(shù)將全局有效,即對(duì)該服務(wù)器上運(yùn)行的所有MySQL數(shù)據(jù)庫(kù)服務(wù)器都有效。
局部:把這個(gè)my.cnf文件復(fù)制到[MYSQL-INSTALL-DIR]/var/將使該文件只對(duì)指定的服務(wù)器有效,其中[MYSQL-INSTALL-DIR]表示安裝MySQL的目錄。
用戶(hù):最后,我們還可以把該文件的作用范圍局限到指定的用戶(hù),這只需把my.cnf文件復(fù)制到用戶(hù)的根目錄即可。
那么,如何設(shè)置my.cnf文件中的參數(shù)呢?或者進(jìn)一步說(shuō),哪些參數(shù)是我們可以設(shè)置的呢?所有這些參數(shù)都對(duì)MySQL服務(wù)器有著全局性的影響,但同時(shí)每一個(gè)參數(shù)都和MySQL的特定部分關(guān)系較為密切。例如,max_connections參數(shù)屬于mysqld一類(lèi)。那么,如何才能得知這一點(diǎn)呢?這只需執(zhí)行如下命令:
% >/usr/local/mysql/libexec/mysqld –help
該命令將顯示出和mysqld有關(guān)的各種選項(xiàng)和參數(shù)。要尋找這些參數(shù)非常方便,因?yàn)檫@些參數(shù)都在“Possible variables for option –set-variable (-O) are”這行內(nèi)容的后面。找到這些參數(shù)之后,我們就可以在my.cnf文件中按照如下方式設(shè)置所有這些參數(shù):
set-variable = max_connections=100
這行代碼的效果是:同時(shí)連接MySQL服務(wù)器的最大連接數(shù)量限制為100。不要忘了在my.cnf文件[mysqld]小節(jié)加上一個(gè)set-variable指令,具體請(qǐng)參見(jiàn)配置文件中的示例。
MySQL的max_connections參數(shù)用來(lái)設(shè)置最大連接(用戶(hù))數(shù)。每個(gè)連接MySQL的用戶(hù)均算作一個(gè)連接,max_connections的默認(rèn)值為100。本文將講解此參數(shù)的詳細(xì)作用與性能影響。
[max_connections]
=================================================================================================
MySQL無(wú)論如何都會(huì)保留一個(gè)用于管理員(SUPER)登陸的連接,用于管理員連接數(shù)據(jù)庫(kù)進(jìn)行維護(hù)操作,即使當(dāng)前連接數(shù)已經(jīng)達(dá)到了max_connections。因此MySQL的實(shí)際最大可連接數(shù)為max_connections+1;
這個(gè)參數(shù)實(shí)際起作用的最大值(實(shí)際最大可連接數(shù))為16384,即該參數(shù)最大值不能超過(guò)16384,即使超過(guò)也以16384為準(zhǔn);
增加max_connections參數(shù)的值,不會(huì)占用太多系統(tǒng)資源。系統(tǒng)資源(CPU、內(nèi)存)的占用主要取決于查詢(xún)的密度、效率等;
該參數(shù)設(shè)置過(guò)小的最明顯特征是出現(xiàn)”Too many connections”錯(cuò)誤;
我們先來(lái)看下如何查看當(dāng)前mysql的max_connections的值:
如下sql
復(fù)制代碼代碼如下:show variables like "max_connections";
?
顯示的結(jié)果如下格式
+-----------------+-------+
| Variable_name?? | Value |
+-----------------+-------+
| max_connections | 100?? |
+-----------------+-------+
可以通過(guò)下面的sql語(yǔ)句將max_connections的值設(shè)置為200,當(dāng)然前提是當(dāng)前登錄的用戶(hù)有足夠的權(quán)限:
set global max_connections = 200;
這個(gè)設(shè)置會(huì)馬上生效,但是當(dāng)mysql重啟時(shí)這個(gè)設(shè)置會(huì)失效,更好的辦法是修改mysql的ini配置文件my.ini
找到mysqld塊,修改或者添加下面的設(shè)置:
max_connections=200
這樣修改之后,即便重啟mysql也會(huì)默認(rèn)載入這個(gè)配置了
?不過(guò)為了安全期間,建議大家直接到my.ini里修改,么有可以加上。
調(diào)整max_connections參數(shù)的值
調(diào)整此參數(shù)的方法有幾種,既可以在編譯的時(shí)候設(shè)置,也可以在MySQL配置文件 my.cnf 中設(shè)置,也可以直接使用命令調(diào)整并立即生效。
1、在編譯的時(shí)候設(shè)置默認(rèn)最大連接數(shù)
打開(kāi)MySQL的源碼,進(jìn)入sql目錄,修改mysqld.cc文件:
復(fù)制代碼代碼如下:{"max_connections", OPT_MAX_CONNECTIONS,
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
0},
紅色的”100″即為該參數(shù)的默認(rèn)值,修改為想要的數(shù)值,存盤(pán)退出。然后執(zhí)行
./configure;make;make install
重新編譯安裝MySQL;注意,由于編譯安裝且修改了MySQL源碼,此操作最好在安裝MySQL之前進(jìn)行;
?
2、在配置文件my.cnf中設(shè)置max_connections的值
打開(kāi)MySQL配置文件my.cnf
復(fù)制代碼代碼如下:[root@www ~]# vi /etc/my.cnf
找到max_connections一行,修改為(如果沒(méi)有,則自己添加),
max_connections = 1000
上面的1000即該參數(shù)的值。
?
3、實(shí)時(shí)(臨時(shí))修改此參數(shù)的值
首先登陸mysql,執(zhí)行如下命令:
復(fù)制代碼代碼如下:[root@www ~]# mysql -uroot -p
然后輸入MySQL Root的密碼。
?
查看當(dāng)前的Max_connections參數(shù)值:
復(fù)制代碼代碼如下:mysql> SELECT @@MAX_CONNECTIONS AS 'Max Connections';
設(shè)置該參數(shù)的值:
mysql> set GLOBAL max_connections=1000;
(注意上面命令的大小寫(xiě))
?
修改完成后實(shí)時(shí)生效,無(wú)需重啟MySQL。
總體來(lái)說(shuō),該參數(shù)在服務(wù)器資源夠用的情況下應(yīng)該盡量設(shè)置大,以滿(mǎn)足多個(gè)客戶(hù)端同時(shí)連接的需求。否則將會(huì)出現(xiàn)類(lèi)似”Too many connections”的錯(cuò)誤。
?
【THREAD_CACHE】
=================================================================================================
MySQL里面為了提高客戶(hù)端請(qǐng)求創(chuàng)建連接過(guò)程的性能,提供了一個(gè)連接池也就是 Thread_Cache池,將空閑的連接線(xiàn)程放在連接池中,而不是立即銷(xiāo)毀.這樣的好處就是,當(dāng)又有一個(gè)新的請(qǐng)求的時(shí)候,mysql不會(huì)立即去創(chuàng)建連接 線(xiàn)程,而是先去Thread_Cache中去查找空閑的連接線(xiàn)程,如果存在則直接使用,不存在才創(chuàng)建新的連接線(xiàn)程.
有關(guān)Thread_Cache在MySQL有幾個(gè)重要的參數(shù),簡(jiǎn)單介紹如下:
thread_cache_size
Thread_Cache 中存放的最大連接線(xiàn)程數(shù).在短連接的應(yīng)用中Thread_Cache的功效非常明顯,因?yàn)樵趹?yīng)用中數(shù)據(jù)庫(kù)的連接和創(chuàng)建是非常頻繁的,如果不使用 Thread_Cache那么消耗的資源是非常可觀(guān)的!在長(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
如果短連接多的話(huà)可以適當(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è)線(xiàn)程,one-thread-per-connection 服務(wù)器為每個(gè)客戶(hù)端請(qǐng)求使用一個(gè)線(xiàn)程.原手冊(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è)連接線(xiàn)程,為每個(gè)客戶(hù)端球使用一個(gè)線(xiàn)程.為每個(gè)連接的線(xiàn)程分配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é)果我還是比較滿(mǎn)意的.但是可以看出 thread_cache_size有點(diǎn)多余改成16或8更合理一些.
?
?
【TABLE_OPEN_CACHE】
==========================================================================================================
由于MySQL是多線(xiàn)程的機(jī)制,為了提高性能,每個(gè)線(xiàn)程都是獨(dú)自打開(kāi)自己需要的表的文件描 述符,而不是通過(guò)共享已經(jīng)打開(kāi)的.針對(duì)不同存儲(chǔ)引擎處理的方法當(dāng)然也不一樣.
在myisam表引擎中,數(shù)據(jù)文件的描述符 (descriptor)是不共享的,但是索引文件的描述符卻是所有線(xiàn)程共享的.Innodb中和使用表空間類(lèi)型有關(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è)表,將為該線(xiàn)程專(zhuān)門(mén)分配一個(gè)表。該表不被其它線(xiàn)程共享,只有線(xiàn)程調(diào)用HANDLER tbl_name CLOSE或線(xiàn)程終止后才被關(guān)閉。表關(guān)閉后,被拉回表緩存中(如果緩存不滿(mǎn))。
?
mysql手冊(cè)上給的建議大小 是:table_cache=max_connections*n
n表示查詢(xún)語(yǔ)句中最大表數(shù), 還需要為臨時(shí)表和文件保留一些額外的文件描述符。
這個(gè)數(shù)據(jù)遭到很多質(zhì)疑,table_cache夠用就好,檢查 Opened_tables值,如果這個(gè)值很大,或增長(zhǎng)很快那么你就得考慮加大table_cache了.
在下面的條件下,未使用的表 將被關(guān)閉并從表緩存中移出:
當(dāng)緩存滿(mǎn)了并且一個(gè)線(xiàn)程試圖打開(kāi)一個(gè)不在緩存中的表時(shí)。
當(dāng)緩存包含超過(guò)table_cache個(gè)條目,并且緩存中的表不再被任何線(xiàn)程使用。
當(dāng)表刷新操作發(fā)生。當(dāng)執(zhí)行FLUSH TABLES語(yǔ)句或執(zhí)行mysqladmin flush-tables或mysqladmin refresh命令時(shí)會(huì)發(fā)生。
當(dāng)表緩存滿(mǎn)時(shí),服務(wù)器使用下列過(guò)程找到一個(gè)緩存入口來(lái)使用:
當(dāng)前未使用的表被釋放,以最近最少使用順序。
如果緩存滿(mǎn)了并且沒(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:所有線(xiàn)程打開(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)載于:https://www.cnblogs.com/zhangkeyu/p/6657751.html
總結(jié)
以上是生活随笔為你收集整理的mysql配置以及性能优化(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2022-07-26 微信服务商
- 下一篇: Mac 编译安装 Redis-3.2.3