MySQL高级配置(二)详细介绍
一、MySQL優(yōu)化配置詳解
轉(zhuǎn)自:http://blog.csdn.net/nightelve/article/details/17393631
1、目的:
通過根據(jù)服務器目前狀況,修改Mysql的系統(tǒng)參數(shù),達到合理利用服務器現(xiàn)有資源,最大合理的提高MySQL性能。
?
2、服務器參數(shù):
32G內(nèi)存、4個CPU,每個CPU?8核。
3、MySQL目前安裝狀況。
????MySQL目前安裝,用的是MySQL默認的最大支持配置。拷貝的是my-huge.cnf.編碼已修改為UTF-8.具體修改及安裝MySQL,可以參考<<Linux系統(tǒng)上安裝MySQL?5.5>>幫助文檔。
4、修改MySQL配置
打開MySQL配置文件my.cnf
?
vi??/etc/my.cnf |
4.1?MySQL非緩存參數(shù)變量介紹及修改
4.1.1修改back_log參數(shù)值:由默認的50修改為500.(每個連接256kb,占用:125M)
??????????back_log=500
????back_log值指出在MySQL暫時停止回答新請求之前的短時間內(nèi)多少個請求可以被存在堆棧中。也就是說,如果MySql的連接數(shù)據(jù)達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數(shù)量即back_log,如果等待連接的數(shù)量超過back_log,將不被授予連接資源。將會報:unauthenticated?user?|?xxx.xxx.xxx.xxx?|?NULL?|?Connect?|?NULL?|?login?|?NULL?的待連接進程時. back_log值不能超過TCP/IP連接的偵聽隊列的大小。若超過則無效,查看當前系統(tǒng)的TCP/IP連接的偵聽隊列的大小命令:cat?/proc/sys/net/ipv4/tcp_max_syn_backlog目前系統(tǒng)為1024。對于Linux系統(tǒng)推薦設置為小于512的整數(shù)。 修改系統(tǒng)內(nèi)核參數(shù),)http://www.51testing.com/html/64/n-810764.html 查看mysql?當前系統(tǒng)默認back_log值,命令: show?variables?like?'back_log';?查看當前數(shù)量 |
?
4.1.2修改wait_timeout參數(shù)值,由默認的8小時,修改為30分鐘。(本次不用)
??????????wait_timeout=1800(單位為妙)
?
我對wait-timeout這個參數(shù)的理解:MySQL客戶端的數(shù)據(jù)庫連接閑置最大時間值。 說得比較通俗一點,就是當你的MySQL連接閑置超過一定時間后將會被強行關(guān)閉。MySQL默認的wait-timeout??值為8個小時,可以通過命令show?variables?like?'wait_timeout'查看結(jié)果值;。 設置這個值是非常有意義的,比如你的網(wǎng)站有大量的MySQL鏈接請求(每個MySQL連接都是要內(nèi)存資源開銷的?),由于你的程序的原因有大量的連接請求空閑啥事也不干,白白占用內(nèi)存資源,或者導致MySQL超過最大連接數(shù)從來無法新建連接導致“Too?many?connections”的錯誤。在設置之前你可以查看一下你的MYSQL的狀態(tài)(可用show?processlist),如果經(jīng)常發(fā)現(xiàn)MYSQL中有大量的Sleep進程,則需要?修改wait-timeout值了。 interactive_timeout:服務器關(guān)閉交互式連接前等待活動的秒數(shù)。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。 wait_timeout:服務器關(guān)閉非交互連接之前等待活動的秒數(shù)。在線程啟動時,根據(jù)全局wait_timeout值或全局?interactive_timeout值初始化會話wait_timeout值,取決于客戶端類型(由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義). 這兩個參數(shù)必須配合使用。否則單獨設置wait_timeout無效 |
?
4.1.3修改max_connections參數(shù)值,由默認的151,修改為3000(750M)。
????max_connections=3000
max_connections是指MySql的最大連接數(shù),如果服務器的并發(fā)連接請求量比較大,建議調(diào)高此值,以增加并行連接數(shù)量,當然這建立在機器能支撐的情況下,因為如果連接數(shù)越多,介于MySql會為每個連接提供連接緩沖區(qū),就會開銷越多的內(nèi)存,所以要適當調(diào)整該值,不能盲目提高設值。可以過'conn%'通配符查看當前狀態(tài)的連接數(shù)量,以定奪該值的大小。 MySQL服務器允許的最大連接數(shù)16384; 查看系統(tǒng)當前最大連接數(shù): show?variables?like?'max_connections'; |
?
4.1..4修改max_user_connections值,由默認的0,修改為800
?????max_user_connections=800
?max_user_connections是指每個數(shù)據(jù)庫用戶的最大連接 針對某一個賬號的所有客戶端并行連接到MYSQL服務的最大并行連接數(shù)。簡單說是指同一個賬號能夠同時連接到mysql服務的最大連接數(shù)。設置為0表示不限制。 目前默認值為:0不受限制。 這兒順便介紹下Max_used_connections:它是指從這次mysql服務啟動到現(xiàn)在,同一時刻并行連接數(shù)的最大值。它不是指當前的連接情況,而是一個比較值。如果在過去某一個時刻,MYSQL服務同時有1000個請求連接過來,而之后再也沒有出現(xiàn)這么大的并發(fā)請求時,則Max_used_connections=1000.請注意與show?variables?里的max_user_connections的區(qū)別。默認為0表示無限大。 查看max_user_connections值 show?variables?like?'max_user_connections'; |
?
4.1.5修改thread_concurrency值,由目前默認的8,修改為64
?????thread_concurrency=64
thread_concurrency的值的正確與否,?對mysql的性能影響很大,?在多個cpu(或多核)的情況下,錯誤設置了thread_concurrency的值,?會導致mysql不能充分利用多cpu(或多核),?出現(xiàn)同一時刻只能一個cpu(或核)在工作的情況。 thread_concurrency應設為CPU核數(shù)的2倍.?比如有一個雙核的CPU,?那thread_concurrency??的應該為4;?2個雙核的cpu,?thread_concurrency的值應為8. 比如:根據(jù)上面介紹我們目前系統(tǒng)的配置,可知道為4個CPU,每個CPU為8核,按照上面的計算規(guī)則,這兒應為:4*8*2=64 查看系統(tǒng)當前thread_concurrency默認配置命令: ?show?variables?like?'thread_concurrency'; |
?
4.1.6添加skip-name-resolve,默認被注釋掉,沒有該參數(shù)。
skip-name-resolve
skip-name-resolve:禁止MySQL對外部連接進行DNS解析,使用這一選項可以消除MySQL進行DNS解析的時間。但需要注意,如果開啟該選項,則所有遠程主機連接授權(quán)都要使用IP地址方式,否則MySQL將無法正常處理連接請求! |
4.1.7?skip-networking,默認被注釋掉。沒有該參數(shù)。(本次無用)
?skip-networking建議被注釋掉,不要開啟
開啟該選項可以徹底關(guān)閉MySQL的TCP/IP連接方式,如果WEB服務器是以遠程連接的方式訪問MySQL數(shù)據(jù)庫服務器則不要開啟該選項!否則將無法正常連接! |
4.1.8??default-storage-engine(設置MySQL的默認存儲引擎)
default-storage-engine=?InnoDB(設置InnoDB類型,另外還可以設置MyISAM類型)
設置創(chuàng)建數(shù)據(jù)庫及表默認存儲類型 show?table?status?like?‘tablename’顯示表的當前存儲狀態(tài)值 查看MySQL有哪些存儲狀態(tài)及默認存儲狀態(tài) ?show?engines; 創(chuàng)建表并指定存儲類型 CREATE?TABLE?mytable?(id?int,?title?char(20))?ENGINE?=?INNODB; 修改表存儲類型: ??Alter?table?tableName?engine?=engineName ? 備注:設置完后把以下幾個開啟: #?Uncomment?the?following?if?you?are?using?InnoDB?tables innodb_data_home_dir?=?/var/lib/mysql #innodb_data_file_path?=?ibdata1:1024M;ibdata2:10M:autoextend(要注釋掉,否則會創(chuàng)建一個新的把原來的替換的。) innodb_log_group_home_dir?=?/var/lib/mysql #?You?can?set?.._buffer_pool_size?up?to?50?-?80?% #?of?RAM?but?beware?of?setting?memory?usage?too?high innodb_buffer_pool_size?=?1000M innodb_additional_mem_pool_size?=?20M #?Set?.._log_file_size?to?25?%?of?buffer?pool?size innodb_log_file_size?=?500M innodb_log_buffer_size?=?20M innodb_flush_log_at_trx_commit?=?0 innodb_lock_wait_timeout?=?50 設置完后一定記得把MySQL安裝目錄地址(我們目前是默認安裝所以地址/var/lib/mysql/)下的ib_logfile0和ib_logfile1刪除掉。否則重啟MySQL起動失敗。 |
?
4.2?MySQL緩存變量介紹及修改
數(shù)據(jù)庫屬于IO密集型的應用程序,其主職責就是數(shù)據(jù)的管理及存儲工作。而我們知道,從內(nèi)存中讀取一個數(shù)據(jù)庫的時間是微秒級別,而從一塊普通硬盤上讀取一個?IO是在毫秒級別,二者相差3個數(shù)量級。所以,要優(yōu)化數(shù)據(jù)庫,首先第一步需要優(yōu)化的就是IO,盡可能將磁盤IO轉(zhuǎn)化為內(nèi)存IO。本文先從MySQL數(shù)據(jù)庫?IO相關(guān)參數(shù)(緩存參數(shù))的角度來看看可以通過哪些參數(shù)進行IO優(yōu)化 |
?
4.2.1全局緩存
啟動MySQL時就要分配并且總是存在的全局緩存。目前有:key_buffer_size(默認值:402653184,即384M)、innodb_buffer_pool_size(默認值:134217728即:128M)、innodb_additional_mem_pool_size(默認值:8388608即:8M)、innodb_log_buffer_size(默認值:8388608即:8M)、query_cache_size(默認值:33554432即:32M)等五個??偣?#xff1a;560M. 這些變量值都可以通過命令如:show?variables?like?'變量名';查看到。 ? |
4.2.1.1:key_buffer_size,本系統(tǒng)目前為384M,可修改為400M
????key_buffer_size=400M
????key_buffer_size是用于索引塊的緩沖區(qū)大小,增加它可得到更好處理的索引(對所有讀和多重寫),對MyISAM(MySQL表存儲的一種類型,可以百度等查看詳情)表性能影響最大的一個參數(shù)。如果你使它太大,系統(tǒng)將開始換頁并且真的變慢了。嚴格說是它決定了數(shù)據(jù)庫索引處理的速度,尤其是索引讀的速度。對于內(nèi)存在4GB左右的服務器該參數(shù)可設置為256M或384M. 怎么才能知道key_buffer_size的設置是否合理呢,一般可以檢查狀態(tài)值Key_read_requests和Key_reads???,比例key_reads?/?key_read_requests應該盡可能的低,比如1:100,1:1000?,1:10000。其值可以用以下命令查得:show?status?like?'key_read%'; 比如查看系統(tǒng)當前key_read和key_read_request值為: +-------------------+-------+ |?Variable_name?????|?Value?| +-------------------+-------+ |?Key_read_requests?|?28535?| |?Key_reads?????????|?269???| +-------------------+-------+ 可知道有28535個請求,有269個請求在內(nèi)存中沒有找到直接從硬盤讀取索引. 未命中緩存的概率為:0.94%=269/28535*100%.??一般未命中概率在0.1之下比較好。目前已遠遠大于0.1,證明效果不好。若命中率在0.01以下,則建議適當?shù)男薷?/span>key_buffer_size值。 http://dbahacker.com/mysql/innodb-myisam-compare(InnoDB與MyISAM的六大區(qū)別) http://kb.cnblogs.com/page/99810/(查看存儲引擎介紹) MyISAM、InnoDB、MyISAM?Merge引擎、InnoDB、memory(heap)、archive |
4.2.1.2:innodb_buffer_pool_size(默認128M)
innodb_buffer_pool_size=1024M(1G)
???innodb_buffer_pool_size:主要針對InnoDB表性能影響最大的一個參數(shù)。功能與Key_buffer_size一樣。InnoDB占用的內(nèi)存,除innodb_buffer_pool_size用于存儲頁面緩存數(shù)據(jù)外,另外正常情況下還有大約8%的開銷,主要用在每個緩存頁幀的描述、adaptive?hash等數(shù)據(jù)結(jié)構(gòu),如果不是安全關(guān)閉,啟動時還要恢復的話,還要另開大約12%的內(nèi)存用于恢復,兩者相加就有差不多21%的開銷。假設:12G的innodb_buffer_pool_size,最多的時候InnoDB就可能占用到14.5G的內(nèi)存。若系統(tǒng)只有16G,而且只運行MySQL,且MySQL只用InnoDB, 那么為MySQL開12G,是最大限度地利用內(nèi)存了。 另外InnoDB和?MyISAM?存儲引擎不同,?MyISAM?的?key_buffer_size?只能緩存索引鍵,而?innodb_buffer_pool_size?卻可以緩存數(shù)據(jù)塊和索引鍵。適當?shù)脑黾舆@個參數(shù)的大小,可以有效的減少?InnoDB?類型的表的磁盤?I/O?。 當我們操作一個?InnoDB?表的時候,返回的所有數(shù)據(jù)或者去數(shù)據(jù)過程中用到的任何一個索引塊,都會在這個內(nèi)存區(qū)域中走一遭。 可以通過?(Innodb_buffer_pool_read_requests?–?Innodb_buffer_pool_reads)?/?Innodb_buffer_pool_read_requests?*?100%?計算緩存命中率,并根據(jù)命中率來調(diào)整?innodb_buffer_pool_size?參數(shù)大小進行優(yōu)化。值可以用以下命令查得:show?status?like?'Innodb_buffer_pool_read%'; 比如查看當前系統(tǒng)中系統(tǒng)中 |?Innodb_buffer_pool_read_requests??????|?1283826?| |?Innodb_buffer_pool_reads??????????????|?519?????| +---------------------------------------+---------+ 其命中率99.959%=(1283826-519)/1283826*100%??命中率越高越好。 |
4.2.1.3:innodb_additional_mem_pool_size(默認8M)
??innodb_additional_mem_pool_size=20M
?????innodb_additional_mem_pool_size?設置了InnoDB存儲引擎用來存放數(shù)據(jù)字典信息以及一些內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間大小,所以當我們一個MySQL?Instance中的數(shù)據(jù)庫對象非常多的時候,是需要適當調(diào)整該參數(shù)的大小以確保所有數(shù)據(jù)都能存放在內(nèi)存中提高訪問效率的。 這個參數(shù)大小是否足夠還是比較容易知道的,因為當過小的時候,MySQL會記錄Warning信息到數(shù)據(jù)庫的error?log中,這時候你就知道該調(diào)整這個參數(shù)大小了。 查看當前系統(tǒng)mysql的error日志??cat??/var/lib/mysql/機器名.error?發(fā)現(xiàn)有很多waring警告。所以要調(diào)大為20M. 根據(jù)MySQL手冊,對于2G內(nèi)存的機器,推薦值是20M。 ????32G內(nèi)存的?100M |
4.2.1.4:innodb_log_buffer_size(默認8M)
innodb_log_buffer_size=20M
????innodb_log_buffer_size??這是InnoDB存儲引擎的事務日志所使用的緩沖區(qū)。類似于Binlog?Buffer,InnoDB在寫事務日志的時候,為了提高性能,也是先將信息寫入Innofb?Log?Buffer中,當滿足innodb_flush_log_trx_commit參數(shù)所設置的相應條件(或者日志緩沖區(qū)寫滿)之后,才會將日志寫到文件?(或者同步到磁盤)中??梢酝ㄟ^innodb_log_buffer_size?參數(shù)設置其可以使用的最大內(nèi)存空間。 ???InnoDB?將日志寫入日志磁盤文件前的緩沖大小。理想值為?1M?至?8M。大的日志緩沖允許事務運行時不需要將日志保存入磁盤而只到事務被提交(commit)。?因此,如果有大的事務處理,設置大的日志緩沖可以減少磁盤I/O。?在?my.cnf中以數(shù)字格式設置。 默認是8MB,系的如頻繁的系統(tǒng)可適當增大至4MB~8MB。當然如上面介紹所說,這個參數(shù)實際上還和另外的flush參數(shù)相關(guān)。一般來說不建議超過32MB 注:innodb_flush_log_trx_commit參數(shù)對InnoDB?Log的寫入性能有非常關(guān)鍵的影響,默認值為1。該參數(shù)可以設置為0,1,2,解釋如下: 0:log?buffer中的數(shù)據(jù)將以每秒一次的頻率寫入到log?file中,且同時會進行文件系統(tǒng)到磁盤的同步操作,但是每個事務的commit并不會觸發(fā)任何log?buffer?到log?file的刷新或者文件系統(tǒng)到磁盤的刷新操作; 1:在每次事務提交的時候?qū)og?buffer?中的數(shù)據(jù)都會寫入到log?file,同時也會觸發(fā)文件系統(tǒng)到磁盤的同步; 2:事務提交會觸發(fā)log?buffer到log?file的刷新,但并不會觸發(fā)磁盤文件系統(tǒng)到磁盤的同步。此外,每秒會有一次文件系統(tǒng)到磁盤同步操作。 實際測試發(fā)現(xiàn),該值對插入數(shù)據(jù)的速度影響非常大,設置為2時插入10000條記錄只需要2秒,設置為0時只需要1秒,而設置為1時則需要229秒。因此,MySQL手冊也建議盡量將插入操作合并成一個事務,這樣可以大幅提高速度。根據(jù)MySQL手冊,在存在丟失最近部分事務的危險的前提下,可以把該值設為0。 |
?
4.5.1.5:query_cache_size(默認32M)
query_cache_size=40M
?????query_cache_size:?主要用來緩存MySQL中的ResultSet,也就是一條SQL語句執(zhí)行的結(jié)果集,所以僅僅只能針對select語句。當我們打開了?Query?Cache功能,MySQL在接受到一條select語句的請求后,如果該語句滿足Query?Cache的要求(未顯式說明不允許使用Query?Cache,或者已經(jīng)顯式申明需要使用Query?Cache),MySQL會直接根據(jù)預先設定好的HASH算法將接受到的select語句以字符串方式進行hash,然后到Query?Cache中直接查找是否已經(jīng)緩存。也就是說,如果已經(jīng)在緩存中,該select請求就會直接將數(shù)據(jù)返回,從而省略了后面所有的步驟(如SQL語句的解析,優(yōu)化器優(yōu)化以及向存儲引擎請求數(shù)據(jù)等),極大的提高性能。根據(jù)MySQL用戶手冊,使用查詢緩沖最多可以達到238%的效率。 當然,Query?Cache也有一個致命的缺陷,那就是當某個表的數(shù)據(jù)有任何任何變化,都會導致所有引用了該表的select語句在Query?Cache中的緩存數(shù)據(jù)失效。所以,當我們的數(shù)據(jù)變化非常頻繁的情況下,使用Query?Cache可能會得不償失 ???Query?Cache的使用需要多個參數(shù)配合,其中最為關(guān)鍵的是query_cache_size和query_cache_type,前者設置用于緩存?ResultSet的內(nèi)存大小,后者設置在何場景下使用Query?Cache。在以往的經(jīng)驗來看,如果不是用來緩存基本不變的數(shù)據(jù)的MySQL數(shù)據(jù)庫,query_cache_size一般256MB是一個比較合適的大小。當然,這可以通過計算Query?Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))來進行調(diào)整。?query_cache_type可以設置為0(OFF),1(ON)或者2(DEMOND),分別表示完全不使用query?cache,除顯式要求不使用query?cache(使用sql_no_cache)之外的所有的select都使用query?cache,只有顯示要求才使用query?cache(使用sql_cache)。如果Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖.?如果Qcache_hits的值也非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小; 根據(jù)命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))進行調(diào)整,一般不建議太大,256MB可能已經(jīng)差不多了,大型的配置型靜態(tài)數(shù)據(jù)可適當調(diào)大. 可以通過命令:show?status?like?'Qcache_%';查看目前系統(tǒng)Query?catch使用大小 |?Qcache_hits?????????????|?1892463??| |?Qcache_inserts??????????|?35627?? 命中率98.17%=1892463/(1892463?+35627?)*100 |
4.2.2局部緩存
除了全局緩沖,MySql還會為每個連接發(fā)放連接緩沖。個連接到MySQL服務器的線程都需要有自己的緩沖。大概需要立刻分配256K,甚至在線程空閑時,它們使用默認的線程堆棧,網(wǎng)絡緩存等。事務開始之后,則需要增加更多的空間。運行較小的查詢可能僅給指定的線程增加少量的內(nèi)存消耗,然而如果對數(shù)據(jù)表做復雜的操作例如掃描、排序或者需要臨時表,則需分配大約read_buffer_size, sort_buffer_size,read_rnd_buffer_size,tmp_table_size?大小的內(nèi)存空間.?不過它們只是在需要的時候才分配,并且在那些操作做完之后就釋放了。有的是立刻分配成單獨的組塊。tmp_table_size?可能高達MySQL所能分配給這個操作的最大內(nèi)存空間了 。注意,這里需要考慮的不只有一點——可能會分配多個同一種類型的緩存,例如用來處理子查詢。一些特殊的查詢的內(nèi)存使用量可能更大——如果在MyISAM表上做成批的插入 時需要分配?bulk_insert_buffer_size?大小的內(nèi)存;執(zhí)行?ALTER?TABLE,?OPTIMIZE?TABLE,?REPAIR?TABLE?命令時需要分配?myisam_sort_buffer_size?大小的內(nèi)存。 |
4.2.2.1:read_buffer_size(默認值:2097144即2M)
read_buffer_size=4M
???????read_buffer_size?是MySql讀入緩沖區(qū)大小。對表進行順序掃描的請求將分配一個讀入緩沖區(qū),MySql會為它分配一段內(nèi)存緩沖區(qū)。read_buffer_size變量控制這一 緩沖區(qū)的大小。如果對表的順序掃描請求非常頻繁,并且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及內(nèi)存緩沖區(qū)大小提高其性能. |
?
4.2.2.2:sort_buffer_size(默認值:2097144即2M)
sort_buffer_size=4M
????sort_buffer_size是MySql執(zhí)行排序使用的緩沖大小。如果想要增加ORDER?BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。如果不能,可以嘗試增加sort_buffer_size變量的大小 |
4.2.2.3:??read_rnd_buffer_size(默認值:8388608即8M)
read_rnd_buffer_size=8M
read_rnd_buffer_size?是MySql的隨機讀緩沖區(qū)大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區(qū)。進行排序查詢時,MySql會首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數(shù)據(jù),可適當調(diào)高該值。但MySql會為每個客戶連接發(fā)放該緩沖空間,所以應盡量適當設置該值,以避免內(nèi)存開 銷過大。 |
4.2.2.4:??tmp_table_size(默認值:8388608?即:16M)
tmp_table_size=16M
???tmp_table_size是MySql的heap?(堆積)表緩沖大小。所有聯(lián)合在一個DML指令內(nèi)完成,并且大多數(shù)聯(lián)合甚至可以不用臨時表即可以完成。大多數(shù)臨時表是基于內(nèi) 存的(HEAP)表。具有大的記錄長度的臨時表?(所有列的長度的和)或包含BLOB列的表存儲在硬盤上。如果某個內(nèi)部heap(堆積)表大小超過tmp_table_size,MySQL可以根據(jù)需要自 動將內(nèi)存中的heap表改為基于硬盤的MyISAM表。還可以通過設置tmp_table_size選項來增加臨時表的大小。也就是說,如果調(diào)高該值,MySql同時將增加heap表的大小,可達到提高 聯(lián)接查詢速度的效果。 |
4.2.2.5:record_buffer:(默認值:)
??record_buffer每個進行一個順序掃描的線程為其掃描的每張表分配這個大小的一個緩沖區(qū)。如果你做很多順序掃描,你可能想要增加該值。默認數(shù)值是131072 (128K) |
4.2.3其它緩存:
4.2.3.1:table_cache(默認值:512)
?
TABLE_CACHE(5.1.3及以后版本又名TABLE_OPEN_CACHE) table_cache指定表高速緩存的大小。每當MySQL訪問一個表時,如果在表緩沖區(qū)中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內(nèi)容。通過檢查峰值時間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現(xiàn)open_tables等于table_cache,并且opened_tables在不斷增長,那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW?STATUS?LIKE?‘Open%tables’獲得)。注意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。 SHOW?STATUS?LIKE?'Open%tables'; +---------------+-------+ |?Variable_name?|?Value?| +---------------+-------+ |?Open_tables???|?356???| |?Opened_tables?|?0?????| +---------------+-------+ 2?rows?in?set?(0.00?sec) open_tables表示當前打開的表緩存數(shù),如果執(zhí)行flush?tables操作,則此系統(tǒng)會關(guān)閉一些當前沒有使用的表緩存而使得此狀態(tài)值減小; opend_tables表示曾經(jīng)打開的表緩存數(shù),會一直進行累加,如果執(zhí)行flush?tables操作,值不會減小。 在mysql默認安裝情況下,table_cache的值在2G內(nèi)存以下的機器中的值默認時256到512,如果機器有4G內(nèi)存,則默認這個值?是2048,但這決意味著機器內(nèi)存越大,這個值應該越大,因為table_cache加大后,使得mysql對SQL響應的速度更快了,不可避免的會產(chǎn)生?更多的死鎖(dead?lock),這樣反而使得數(shù)據(jù)庫整個一套操作慢了下來,嚴重影響性能。所以平時維護中還是要根據(jù)庫的實際情況去作出判斷,找到最適合你維護的庫的?table_cache值。 由于MySQL是多線程的機制,為了提高性能,每個線程都是獨自打開自己需要的表的文件描?述符,而不是通過共享已經(jīng)打開的.針對不同存儲引擎處理的方法當然也不一樣 在myisam表引擎中,數(shù)據(jù)文件的描述符?(descriptor)是不共享的,但是索引文件的描述符卻是所有線程共享的.Innodb中和使用表空間類型有關(guān),假如是共享表空間那么實際就一個數(shù)?據(jù)文件,當然占用的數(shù)據(jù)文件描述符就會比獨立表空間少. n表示查詢語句中最大表數(shù),?還需要為臨時表和文件保留一些額外的文件描述符。 這個數(shù)據(jù)遭到很多質(zhì)疑,table_cache夠用就好,檢查?Opened_tables值,如果這個值很大,或增長很快那么你就得考慮加大table_cache了. ??table_cache:所有線程打開的表的數(shù)目。增大該值可以增加mysqld需要的文件描述符的數(shù)量。默認值是64. |
?
4.2.3.2?thread_cache_size?(服務器線程緩存)
thread_cache_size=64
默認的thread_cache_size=8,但是看到好多配置的樣例里的值一般是32,64,甚至是128,感覺這個參數(shù)對優(yōu)化應該有幫助,于是查了下: ??mysql>?show?status?like?'thread%'; 查看開機起來數(shù)據(jù)庫被連接了多少次? mysql>?show?status?like?'%connection%'; 通過連接線程池的命中率來判斷設置值是否合適?命中率超過90%以上,設定合理。 ?(Connections?-??Threads_created)?/?Connections?*?100?% |
二、延伸閱讀-老男孩的MySQL優(yōu)化配置文件解析
http://blog.csdn.net/orichisonic/article/details/48026031
此配置是老男孩生產(chǎn)線上使用的配置,在培訓的時候,他給的,我在這里,對各參數(shù)添加了中文說明
這配置已經(jīng)優(yōu)化的不錯了,如果你的mysql沒有什么特殊情況的話,可以直接使用該配置參數(shù)
MYSQL服務器my.cnf配置文檔詳解
硬件:內(nèi)存16G
[client]
port =?3306
socket =?/data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user =?mysql
port =?3306
socket =?/data/3306/mysql.sock
basedir =?/usr/local/mysql
datadir =?/data/3306/data
open_files_limit????=?10240
back_log?=?600???
#在MYSQL暫時停止響應新請求之前,短時間內(nèi)的多少個請求可以被存在堆棧中。如果系統(tǒng)在短時間內(nèi)有很多連接,則需要增大該參數(shù)的值,該參數(shù)值指定到來的TCP/IP連接的監(jiān)聽隊列的大小。默認值50。
max_connections?=?3000???
#MySQL允許最大的進程連接數(shù),如果經(jīng)常出現(xiàn)Too?Many?Connections的錯誤提示,則需要增大此值。
max_connect_errors?=?6000???
#設置每個主機的連接請求異常中斷的最大次數(shù),當超過該次數(shù),MYSQL服務器將禁止host的連接請求,直到mysql服務器重啟或通過flush?hosts命令清空此host的相關(guān)信息。
table_cache?=?614??
#指示表調(diào)整緩沖區(qū)大小。#?table_cache?參數(shù)設置表高速緩存的數(shù)目。每個連接進來,都會至少打開一個表緩存。#因此,?table_cache?的大小應與?max_connections?的設置有關(guān)。例如,對于?200?個#并行運行的連接,應該讓表的緩存至少有?200?×?N?,這里?N?是應用可以執(zhí)行的查詢#的一個聯(lián)接中表的最大數(shù)量。此外,還需要為臨時表和文件保留一些額外的文件描述符。
#?當?Mysql?訪問一個表時,如果該表在緩存中已經(jīng)被打開,則可以直接訪問緩存;如果#還沒有被緩存,但是在?Mysql?表緩沖區(qū)中還有空間,那么這個表就被打開并放入表緩#沖區(qū);如果表緩存滿了,則會按照一定的規(guī)則將當前未用的表釋放,或者臨時擴大表緩存來存放,使用表緩存的好處是可以更快速地訪問表中的內(nèi)容。執(zhí)行?flush?tables?會#清空緩存的內(nèi)容。一般來說,可以通過查看數(shù)據(jù)庫運行峰值時間的狀態(tài)值?Open_tables?#和?Opened_tables?,判斷是否需要增加?table_cache?的值(其中?open_tables?是當#前打開的表的數(shù)量,?Opened_tables?則是已經(jīng)打開的表的數(shù)量)。即如果open_tables接近table_cache的時候,并且Opened_tables這個值在逐步增加,那就要考慮增加這個#值的大小了。還有就是Table_locks_waited比較高的時候,也需要增加table_cache。
external-locking?=?FALSE??
#使用–skip-external-locking?MySQL選項以避免外部鎖定。該選項默認開啟
max_allowed_packet?=?32M??
#設置在網(wǎng)絡傳輸中一次消息傳輸量的最大值。系統(tǒng)默認值?為1MB,最大值是1GB,必須設置1024的倍數(shù)。
sort_buffer_size?=?2M??
#?Sort_Buffer_Size?是一個connection級參數(shù),在每個connection(session)第一次需要使用這個buffer的時候,一次性分配設置的內(nèi)存。
#Sort_Buffer_Size?并不是越大越好,由于是connection級的參數(shù),過大的設置+高并發(fā)可能會耗盡系統(tǒng)內(nèi)存資源。例如:500個連接將會消耗?500*sort_buffer_size(8M)=4G內(nèi)存
#Sort_Buffer_Size?超過2KB的時候,就會使用mmap()?而不是?malloc()?來進行內(nèi)存分配,導致效率降低。
#技術(shù)導讀?http://blog.webshuo.com/2011/02/16/mysql-sort_buffer_size/
#dev-doc:?http://dev.mysql.com/doc/refman/5.5/en/server-parameters.html
#explain?select*from?table?where?order?limit;出現(xiàn)filesort
#屬重點優(yōu)化參數(shù)
join_buffer_size?=?2M???
#用于表間關(guān)聯(lián)緩存的大小,和sort_buffer_size一樣,該參數(shù)對應的分配內(nèi)存也是每個連接獨享。
thread_cache_size?=?300???
#?服務器線程緩存這個值表示可以重新利用保存在緩存中線程的數(shù)量,當斷開連接時如果緩存中還有空間,那么客戶端的線程將被放到緩存中,如果線程重新被請求,那么請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那么這個線程將被重新創(chuàng)建,如果有很多新的線程,增加這個值可以改善系統(tǒng)性能.通過比較?Connections?和?Threads_created?狀態(tài)的變量,可以看到這個變量的作用。設置規(guī)則如下:1GB?內(nèi)存配置為8,2GB配置為16,3GB配置為32,4GB或更高內(nèi)存,可配置更大。
thread_concurrency?=?8???
#?設置thread_concurrency的值的正確與否,?對mysql的性能影響很大,?在多個cpu(或多核)的情況下,錯誤設置了thread_concurrency的值,?會導致mysql不能充分利用多cpu(或多核),?出現(xiàn)同一時刻只能一個cpu(或核)在工作的情況。thread_concurrency應設為CPU核數(shù)的2倍.?比如有一個雙核的CPU,?那么thread_concurrency的應該為4;?2個雙核的cpu,?thread_concurrency的值應為8
#屬重點優(yōu)化參數(shù)
query_cache_size?=?64M???
##?對于使用MySQL的用戶,對于這個變量大家一定不會陌生。前幾年的MyISAM引擎優(yōu)化中,這個參數(shù)也是一個重要的優(yōu)化參數(shù)。但隨著發(fā)展,這個參數(shù)也爆露出來一些問題。機器的內(nèi)存越來越大,人們也都習慣性的把以前有用的參數(shù)分配的值越來越大。這個參數(shù)加大后也引發(fā)了一系列問題。我們首先分析一下?query_cache_size的工作原理:一個SELECT查詢在DB中工作后,DB會把該語句緩存下來,當同樣的一個SQL再次來到DB里調(diào)用時,DB在該表沒發(fā)生變化的情況下把結(jié)果從緩存中返回給Client。這里有一個關(guān)建點,就是DB在利用Query_cache工作時,要求該語句涉及的表在這段時間內(nèi)沒有發(fā)生變更。那如果該表在發(fā)生變更時,Query_cache里的數(shù)據(jù)又怎么處理呢?首先要把Query_cache和該表相關(guān)的語句全部置為失效,然后在寫入更新。那么如果Query_cache非常大,該表的查詢結(jié)構(gòu)又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎么這么慢了。所以在數(shù)據(jù)庫寫入量或是更新量也比較大的系統(tǒng),該參數(shù)不適合分配過大。而且在高并發(fā),寫入量大的系統(tǒng),建議把該功能禁掉。
#重點優(yōu)化參數(shù)(主庫?增刪改-MyISAM)
query_cache_limit?=?4M????
#指定單個查詢能夠使用的緩沖區(qū)大小,缺省為1M
query_cache_min_res_unit?=?2k????
#默認是4KB,設置值大對大數(shù)據(jù)查詢有好處,但如果你的查詢都是小數(shù)據(jù)查詢,就容易造成內(nèi)存碎片和浪費
#查詢緩存碎片率?=?Qcache_free_blocks?/?Qcache_total_blocks?*?100%
#如果查詢緩存碎片率超過20%,可以用FLUSH?QUERY?CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數(shù)據(jù)量的話。
#查詢緩存利用率?=?(query_cache_size?–?Qcache_free_memory)?/?query_cache_size?*?100%
#查詢緩存利用率在25%以下的話說明query_cache_size設置的過大,可適當減小;查詢緩存利用率在80%以上而且Qcache_lowmem_prunes?>?50的話說明query_cache_size可能有點小,要不就是碎片太多。
#查詢緩存命中率?=?(Qcache_hits?–?Qcache_inserts)?/?Qcache_hits?*?100%
default-storage-engine?=?MyISAM
#default_table_type?=?InnoDB
thread_stack?=?192K??
#設置MYSQL每個線程的堆棧大小,默認值足夠大,可滿足普通操作??稍O置范圍為128K至4GB,默認為192KB。
transaction_isolation?=?READ-COMMITTED???
#?設定默認的事務隔離級別.可用的級別如下:
#?READ-UNCOMMITTED,?READ-COMMITTED,?REPEATABLE-READ,?SERIALIZABLE
#?1.READ?UNCOMMITTED-讀未提交2.READ?COMMITTE-讀已提交3.REPEATABLE?READ?-可重復讀4.SERIALIZABLE?-串行
tmp_table_size?=?256M???
#?tmp_table_size?的默認大小是?32M。如果一張臨時表超出該大小,MySQL產(chǎn)生一個?The?table?tbl_name?is?full?形式的錯誤,如果你做很多高級?GROUP?BY?查詢,增加?tmp_table_size?值。如果超過該值,則會將臨時表寫入磁盤。
max_heap_table_size?=?256M
long_query_time?=?2
log_long_format
log-slow-queries=/data/3306/slow-log.log
#log-bin?=?/data/3306/mysql-bin
log-bin
binlog_cache_size?=?4M
max_binlog_cache_size?=?8M
max_binlog_size?=?512M
expire_logs_days?=?7
key_buffer_size?=?2048M?
#批定用于索引的緩沖區(qū)大小,增加它可以得到更好的索引處理性能,對于內(nèi)存在4GB左右的服務器來說,該參數(shù)可設置為256MB或384MB。
read_buffer_size?=?1M??
#?MySql讀入緩沖區(qū)大小。對表進行順序掃描的請求將分配一個讀入緩沖區(qū),MySql會為它分配一段內(nèi)存緩沖區(qū)。read_buffer_size變量控制這一緩沖區(qū)的大小。如果對表的順序掃描請求非常頻繁,并且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及內(nèi)存緩沖區(qū)大小提高其性能。和sort_buffer_size一樣,該參數(shù)對應的分配內(nèi)存也是每個連接獨享。
read_rnd_buffer_size?=?16M???
#?MySql的隨機讀(查詢操作)緩沖區(qū)大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區(qū)。進行排序查詢時,MySql會首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數(shù)據(jù),可適當調(diào)高該值。但MySql會為每個客戶連接發(fā)放該緩沖空間,所以應盡量適當設置該值,以避免內(nèi)存開銷過大。
bulk_insert_buffer_size?=?64M???
#批量插入數(shù)據(jù)緩存大小,可以有效提高插入效率,默認為8M
myisam_sort_buffer_size?=?128M???
#?MyISAM表發(fā)生變化時重新排序所需的緩沖
myisam_max_sort_file_size?=?10G???
#?MySQL重建索引時所允許的最大臨時文件的大小?(當?REPAIR,?ALTER?TABLE?或者?LOAD?DATA?INFILE).
#?如果文件大小比此值更大,索引會通過鍵值緩沖創(chuàng)建(更慢)
myisam_max_extra_sort_file_size?=?10G
myisam_repair_threads?=?1???
#?如果一個表擁有超過一個索引,?MyISAM?可以通過并行排序使用超過一個線程去修復他們.
#?這對于擁有多個CPU以及大量內(nèi)存情況的用戶,是一個很好的選擇.
myisam_recover???
#自動檢查和修復沒有適當關(guān)閉的?MyISAM?表
skip-name-resolve
lower_case_table_names?=?1
server-id?=?1
innodb_additional_mem_pool_size?=?16M???
#這個參數(shù)用來設置?InnoDB?存儲的數(shù)據(jù)目錄信息和其它內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)存池大小,類似于Oracle的library?cache。這不是一個強制參數(shù),可以被突破。
innodb_buffer_pool_size?=?2048M???
#?這對Innodb表來說非常重要。Innodb相比MyISAM表對緩沖更為敏感。MyISAM可以在默認的?key_buffer_size?設置下運行的可以,然而Innodb在默認的?innodb_buffer_pool_size?設置下卻跟蝸牛似的。由于Innodb把數(shù)據(jù)和索引都緩存起來,無需留給操作系統(tǒng)太多的內(nèi)存,因此如果只需要用Innodb的話則可以設置它高達?70-80%?的可用內(nèi)存。一些應用于?key_buffer?的規(guī)則有?—?如果你的數(shù)據(jù)量不大,并且不會暴增,那么無需把?innodb_buffer_pool_size?設置的太大了
innodb_data_file_path?=?ibdata1:1024M:autoextend???
#表空間文件?重要數(shù)據(jù)
innodb_file_io_threads?=?4???
#文件IO的線程數(shù),一般為?4,但是在?Windows?下,可以設置得較大。
innodb_thread_concurrency?=?8???
#服務器有幾個CPU就設置為幾,建議用默認設置,一般為8.
innodb_flush_log_at_trx_commit?=?2???
#?如果將此參數(shù)設置為1,將在每次提交事務后將日志寫入磁盤。為×××能,可以設置為0或2,但要承擔在發(fā)生故障時丟失數(shù)據(jù)的風險。設置為0表示事務日志寫入日志文件,而日志文件每秒刷新到磁盤一次。設置為2表示事務日志將在提交時寫入日志,但日志文件每次刷新到磁盤一次。
innodb_log_buffer_size?=?16M??
#此參數(shù)確定些日志文件所用的內(nèi)存大小,以M為單位。緩沖區(qū)更大能提高性能,但意外的故障將會丟失數(shù)據(jù).MySQL開發(fā)人員建議設置為1-8M之間
innodb_log_file_size?=?128M???
#此參數(shù)確定數(shù)據(jù)日志文件的大小,以M為單位,更大的設置可以提高性能,但也會增加恢復故障數(shù)據(jù)庫所需的時間
innodb_log_files_in_group?=?3???
#為提高性能,MySQL可以以循環(huán)方式將日志文件寫到多個文件。推薦設置為3M
innodb_max_dirty_pages_pct?=?90???
#推薦閱讀?http://www.taobaodba.com/html/221_innodb_max_dirty_pages_pct_checkpoint.html
#?Buffer_Pool中Dirty_Page所占的數(shù)量,直接影響InnoDB的關(guān)閉時間。參數(shù)innodb_max_dirty_pages_pct?可以直接控制了Dirty_Page在Buffer_Pool中所占的比率,而且幸運的是innodb_max_dirty_pages_pct是可以動態(tài)改變的。所以,在關(guān)閉InnoDB之前先將innodb_max_dirty_pages_pct調(diào)小,強制數(shù)據(jù)塊Flush一段時間,則能夠大大縮短?MySQL關(guān)閉的時間。
innodb_lock_wait_timeout?=?120???
#?InnoDB?有其內(nèi)置的死鎖檢測機制,能導致未完成的事務回滾。但是,如果結(jié)合InnoDB使用MyISAM的lock?tables?語句或第三方事務引擎,則InnoDB無法識別死鎖。為消除這種可能性,可以將innodb_lock_wait_timeout設置為一個整數(shù)值,指示?MySQL在允許其他事務修改那些最終受事務回滾的數(shù)據(jù)之前要等待多長時間(秒數(shù))
innodb_file_per_table?=?0???
#獨享表空間(關(guān)閉)
[mysqldump]
quick
max_allowed_packet?=?32M
[mysqld_safe]
log-error=/data/3306/mysql_oldboy.err
pid-file=/data/3306/mysqld.pid
#補充
#wait_timeout?=?10???
#指定一個請求的最大連接時間,對于4GB左右的內(nèi)存服務器來說,可以將其設置為5-10。
#skip_networking???
#開啟該選可以徹底關(guān)閉MYSQL的TCP/IP連接方式,如果WEB服務器是以遠程連接的方式訪問MYSQL數(shù)據(jù)庫服務器的,則不要開啟該選項,否則將無法正常連接。
#log-queries-not-using-indexes
轉(zhuǎn)載于:https://blog.51cto.com/9615915/2070183
總結(jié)
以上是生活随笔為你收集整理的MySQL高级配置(二)详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android adb input 命令
- 下一篇: 查看计算机CPU、内存使用情况