文章詳情頁(yè)
MySQL配置文件my.cnf優(yōu)化詳解
瀏覽:5日期:2023-10-16 16:12:18
MySQL 5.5.13參數(shù)說(shuō)明:[client]character-set-server = utf8port = 3306socket = /data/mysql/3306/mysql.sock[mysqld]character-set-server = utf8user = mysqlport = 3306socket = /data/mysql/3306/mysql.sockbasedir = /usr/local/webserver/mysqldatadir = /data/mysql/3306/datalog-error = /data/mysql/3306/mysql_error.logpid-file = /data/mysql/3306/mysql.pid# table_cache 參數(shù)設(shè)置表高速緩存的數(shù)目。每個(gè)連接進(jìn)來(lái),都會(huì)至少打開(kāi)一個(gè)表緩存。#因此, table_cache 的大小應(yīng)與 max_connections 的設(shè)置有關(guān)。例如,對(duì)于 200 個(gè)#并行運(yùn)行的連接,應(yīng)該讓表的緩存至少有 200 × N ,這里 N 是應(yīng)用可以執(zhí)行的查詢#的一個(gè)聯(lián)接中表的最大數(shù)量。此外,還需要為臨時(shí)表和文件保留一些額外的文件描述符。# 當(dāng) Mysql 訪問(wèn)一個(gè)表時(shí),如果該表在緩存中已經(jīng)被打開(kāi),則可以直接訪問(wèn)緩存;如果#還沒(méi)有被緩存,但是在 Mysql 表緩沖區(qū)中還有空間,那么這個(gè)表就被打開(kāi)并放入表緩#沖區(qū);如果表緩存滿了,則會(huì)按照一定的規(guī)則將當(dāng)前未用的表釋放,或者臨時(shí)擴(kuò)大表緩存來(lái)存放,使用表緩存的好處是可以更快速地訪問(wèn)表中的內(nèi)容。執(zhí)行 flush tables 會(huì)#清空緩存的內(nèi)容。一般來(lái)說(shuō),可以通過(guò)查看數(shù)據(jù)庫(kù)運(yùn)行峰值時(shí)間的狀態(tài)值 Open_tables #和 Opened_tables ,判斷是否需要增加 table_cache 的值(其中 open_tables 是當(dāng)#前打開(kāi)的表的數(shù)量, Opened_tables 則是已經(jīng)打開(kāi)的表的數(shù)量)。即如果open_tables接近table_cache的時(shí)候,并且Opened_tables這個(gè)值在逐步增加,那就要考慮增加這個(gè)#值的大小了。還有就是Table_locks_waited比較高的時(shí)候,也需要增加table_cache。open_files_limit = 10240table_cache = 512#非動(dòng)態(tài)變量,需要重啟服務(wù)# 指定MySQL可能的連接數(shù)量。當(dāng)MySQL主線程在很短的時(shí)間內(nèi)接收到非常多的連接請(qǐng)求,該參數(shù)生效,主線程花費(fèi)很短的時(shí)間檢查連接并且啟動(dòng)一個(gè)新線程。back_log參數(shù)的值指出在MySQL暫時(shí)停止響應(yīng)新請(qǐng)求之前的短時(shí)間內(nèi)多少個(gè)請(qǐng)求可以被存在堆棧中。如果系統(tǒng)在一個(gè)短時(shí)間內(nèi)有很多連接,則需要增大該參數(shù)的值,該參數(shù)值指定到來(lái)的TCP/IP連接的偵聽(tīng)隊(duì)列的大小。不同的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制。試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無(wú)效的。默認(rèn)值為50。對(duì)于Linux系統(tǒng)推薦設(shè)置為小于512的整數(shù)。back_log = 600#MySQL允許最大連接數(shù)max_connections = 5000#可以允許多少個(gè)錯(cuò)誤連接max_connect_errors = 6000#使用–skip-external-locking MySQL選項(xiàng)以避免外部鎖定。該選項(xiàng)默認(rèn)開(kāi)啟external-locking = FALSE# 設(shè)置最大包,限制server接受的數(shù)據(jù)包大小,避免超長(zhǎng)SQL的執(zhí)行有問(wèn)題 默認(rèn)值為16M,當(dāng)MySQL客戶端或mysqld服務(wù)器收到大于max_allowed_packet字節(jié)的信息包時(shí),將發(fā)出“信息包過(guò)大”錯(cuò)誤,并關(guān)閉連接。對(duì)于某些客戶端,如果通信信息包過(guò)大,在執(zhí)行查詢期間,可能會(huì)遇到“丟失與MySQL服務(wù)器的連接”錯(cuò)誤。默認(rèn)值16M。#dev-doc: http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.htmlmax_allowed_packet = 32M# Sort_Buffer_Size 是一個(gè)connection級(jí)參數(shù),在每個(gè)connection(session)第一次需要使用這個(gè)buffer的時(shí)候,一次性分配設(shè)置的內(nèi)存。#Sort_Buffer_Size 并不是越大越好,由于是connection級(jí)的參數(shù),過(guò)大的設(shè)置+高并發(fā)可能會(huì)耗盡系統(tǒng)內(nèi)存資源。例如:500個(gè)連接將會(huì)消耗 500*sort_buffer_size(8M)=4G內(nèi)存#Sort_Buffer_Size 超過(guò)2KB的時(shí)候,就會(huì)使用mmap() 而不是 malloc() 來(lái)進(jìn)行內(nèi)存分配,導(dǎo)致效率降低。#技術(shù)導(dǎo)讀 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#屬重點(diǎn)優(yōu)化參數(shù)sort_buffer_size = 8M#用于表間關(guān)聯(lián)緩存的大小join_buffer_size = 1M# 服務(wù)器線程緩存這個(gè)值表示可以重新利用保存在緩存中線程的數(shù)量,當(dāng)斷開(kāi)連接時(shí)如果緩存中還有空間,那么客戶端的線程將被放到緩存中,如果線程重新被請(qǐng)求,那么請(qǐng)求將從緩存中讀取,如果緩存中是空的或者是新的請(qǐng)求,那么這個(gè)線程將被重新創(chuàng)建,如果有很多新的線程,增加這個(gè)值可以改善系統(tǒng)性能.通過(guò)比較 Connections 和 Threads_created 狀態(tài)的變量,可以看到這個(gè)變量的作用thread_cache_size = 300# 設(shè)置thread_concurrency的值的正確與否, 對(duì)mysql的性能影響很大, 在多個(gè)cpu(或多核)的情況下,錯(cuò)誤設(shè)置了thread_concurrency的值, 會(huì)導(dǎo)致mysql不能充分利用多cpu(或多核), 出現(xiàn)同一時(shí)刻只能一個(gè)cpu(或核)在工作的情況。thread_concurrency應(yīng)設(shè)為CPU核數(shù)的2倍. 比如有一個(gè)雙核的CPU, 那么thread_concurrency的應(yīng)該為4; 2個(gè)雙核的cpu, thread_concurrency的值應(yīng)為8#屬重點(diǎn)優(yōu)化參數(shù)thread_concurrency = 8# 對(duì)于使用MySQL的用戶,對(duì)于這個(gè)變量大家一定不會(huì)陌生。前幾年的MyISAM引擎優(yōu)化中,這個(gè)參數(shù)也是一個(gè)重要的優(yōu)化參數(shù)。但隨著發(fā)展,這個(gè)參數(shù)也爆露出來(lái)一些問(wèn)題。機(jī)器的內(nèi)存越來(lái)越大,人們也都習(xí)慣性的把以前有用的參數(shù)分配的值越來(lái)越大。這個(gè)參數(shù)加大后也引發(fā)了一系列問(wèn)題。我們首先分析一下 query_cache_size的工作原理:一個(gè)SELECT查詢?cè)贒B中工作后,DB會(huì)把該語(yǔ)句緩存下來(lái),當(dāng)同樣的一個(gè)SQL再次來(lái)到DB里調(diào)用時(shí),DB在該表沒(méi)發(fā)生變化的情況下把結(jié)果從緩存中返回給Client。這里有一個(gè)關(guān)建點(diǎn),就是DB在利用Query_cache工作時(shí),要求該語(yǔ)句涉及的表在這段時(shí)間內(nèi)沒(méi)有發(fā)生變更。那如果該表在發(fā)生變更時(shí),Query_cache里的數(shù)據(jù)又怎么處理呢?首先要把Query_cache和該表相關(guān)的語(yǔ)句全部置為失效,然后在寫(xiě)入更新。那么如果Query_cache非常大,該表的查詢結(jié)構(gòu)又比較多,查詢語(yǔ)句失效也慢,一個(gè)更新或是Insert就會(huì)很慢,這樣看到的就是Update或是Insert怎么這么慢了。所以在數(shù)據(jù)庫(kù)寫(xiě)入量或是更新量也比較大的系統(tǒng),該參數(shù)不適合分配過(guò)大。而且在高并發(fā),寫(xiě)入量大的系統(tǒng),建系把該功能禁掉。#重點(diǎn)優(yōu)化參數(shù)(主庫(kù) 增刪改-MyISAM)query_cache_size = 512M#指定單個(gè)查詢能夠使用的緩沖區(qū)大小,缺省為1Mquery_cache_limit = 2M#默認(rèn)是4KB,設(shè)置值大對(duì)大數(shù)據(jù)查詢有好處,但如果你的查詢都是小數(shù)據(jù)查詢,就容易造成內(nèi)存碎片和浪費(fèi)#查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%#如果查詢緩存碎片率超過(guò)20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數(shù)據(jù)量的話。#查詢緩存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%#查詢緩存利用率在25%以下的話說(shuō)明query_cache_size設(shè)置的過(guò)大,可適當(dāng)減小;查詢緩存利用率在80%以上而且Qcache_lowmem_prunes > 50的話說(shuō)明query_cache_size可能有點(diǎn)小,要不就是碎片太多。#查詢緩存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%query_cache_min_res_unit = 2kdefault-storage-engine = MyISAM#限定用于每個(gè)數(shù)據(jù)庫(kù)線程的棧大小。默認(rèn)設(shè)置足以滿足大多數(shù)應(yīng)用thread_stack = 192K# 設(shè)定默認(rèn)的事務(wù)隔離級(jí)別.可用的級(jí)別如下:# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE# 1.READ UNCOMMITTED-讀未提交2.READ COMMITTE-讀已提交3.REPEATABLE READ -可重復(fù)讀4.SERIALIZABLE -串行transaction_isolation = READ-COMMITTED# tmp_table_size 的默認(rèn)大小是 32M。如果一張臨時(shí)表超出該大小,MySQL產(chǎn)生一個(gè) The table tbl_name is full 形式的錯(cuò)誤,如果你做很多高級(jí) GROUP BY 查詢,增加 tmp_table_size 值。tmp_table_size = 246Mmax_heap_table_size = 246M#索引緩存大小: 它決定了數(shù)據(jù)庫(kù)索引處理的速度,尤其是索引讀的速度key_buffer_size = 512M# MySql讀入緩沖區(qū)大小。對(duì)表進(jìn)行順序掃描的請(qǐng)求將分配一個(gè)讀入緩沖區(qū),MySql會(huì)為它分配一段內(nèi)存緩沖區(qū)。read_buffer_size變量控制這一緩沖區(qū)的大小。如果對(duì)表的順序掃描請(qǐng)求非常頻繁,并且你認(rèn)為頻繁掃描進(jìn)行得太慢,可以通過(guò)增加該變量值以及內(nèi)存緩沖區(qū)大小提高其性能。read_buffer_size = 4M# MySql的隨機(jī)讀(查詢操作)緩沖區(qū)大小。當(dāng)按任意順序讀取行時(shí)(例如,按照排序順序),將分配一個(gè)隨機(jī)讀緩存區(qū)。進(jìn)行排序查詢時(shí),MySql會(huì)首先掃描一遍該緩沖,以避免磁盤(pán)搜索,提高查詢速度,如果需要排序大量數(shù)據(jù),可適當(dāng)調(diào)高該值。但MySql會(huì)為每個(gè)客戶連接發(fā)放該緩沖空間,所以應(yīng)盡量適當(dāng)設(shè)置該值,以避免內(nèi)存開(kāi)銷過(guò)大。read_rnd_buffer_size = 16M#批量插入數(shù)據(jù)緩存大小,可以有效提高插入效率,默認(rèn)為8Mbulk_insert_buffer_size = 64M# MyISAM表發(fā)生變化時(shí)重新排序所需的緩沖myisam_sort_buffer_size = 128M# MySQL重建索引時(shí)所允許的最大臨時(shí)文件的大小 (當(dāng) REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).# 如果文件大小比此值更大,索引會(huì)通過(guò)鍵值緩沖創(chuàng)建(更慢)myisam_max_sort_file_size = 10G# 如果一個(gè)表?yè)碛谐^(guò)一個(gè)索引, MyISAM 可以通過(guò)并行排序使用超過(guò)一個(gè)線程去修復(fù)他們.# 這對(duì)于擁有多個(gè)CPU以及大量?jī)?nèi)存情況的用戶,是一個(gè)很好的選擇.myisam_repair_threads = 1#自動(dòng)檢查和修復(fù)沒(méi)有適當(dāng)關(guān)閉的 MyISAM 表myisam_recoverinteractive_timeout = 120wait_timeout = 120innodb_data_home_dir = /data/mysql/3306/data#表空間文件 重要數(shù)據(jù)innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend#這個(gè)參數(shù)用來(lái)設(shè)置 InnoDB 存儲(chǔ)的數(shù)據(jù)目錄信息和其它內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)存池大小,類似于Oracle的library cache。這不是一個(gè)強(qiáng)制參數(shù),可以被突破。innodb_additional_mem_pool_size = 16M# 這對(duì)Innodb表來(lái)說(shuō)非常重要。Innodb相比MyISAM表對(duì)緩沖更為敏感。MyISAM可以在默認(rèn)的 key_buffer_size 設(shè)置下運(yùn)行的可以,然而Innodb在默認(rèn)的 innodb_buffer_pool_size 設(shè)置下卻跟蝸牛似的。由于Innodb把數(shù)據(jù)和索引都緩存起來(lái),無(wú)需留給操作系統(tǒng)太多的內(nèi)存,因此如果只需要用Innodb的話則可以設(shè)置它高達(dá) 70-80% 的可用內(nèi)存。一些應(yīng)用于 key_buffer 的規(guī)則有 — 如果你的數(shù)據(jù)量不大,并且不會(huì)暴增,那么無(wú)需把 innodb_buffer_pool_size 設(shè)置的太大了innodb_buffer_pool_size = 512M#文件IO的線程數(shù),一般為 4,但是在 Windows 下,可以設(shè)置得較大。innodb_file_io_threads = 4# 在InnoDb核心內(nèi)的允許線程數(shù)量.# 最優(yōu)值依賴于應(yīng)用程序,硬件以及操作系統(tǒng)的調(diào)度方式.# 過(guò)高的值可能導(dǎo)致線程的互斥顛簸.innodb_thread_concurrency = 8# 如果將此參數(shù)設(shè)置為1,將在每次提交事務(wù)后將日志寫(xiě)入磁盤(pán)。為提供性能,可以設(shè)置為0或2,但要承擔(dān)在發(fā)生故障時(shí)丟失數(shù)據(jù)的風(fēng)險(xiǎn)。設(shè)置為0表示事務(wù)日志寫(xiě)入日志文件,而日志文件每秒刷新到磁盤(pán)一次。設(shè)置為2表示事務(wù)日志將在提交時(shí)寫(xiě)入日志,但日志文件每次刷新到磁盤(pán)一次。innodb_flush_log_at_trx_commit = 2#此參數(shù)確定些日志文件所用的內(nèi)存大小,以M為單位。緩沖區(qū)更大能提高性能,但意外的故障將會(huì)丟失數(shù)據(jù).MySQL開(kāi)發(fā)人員建議設(shè)置為1-8M之間innodb_log_buffer_size = 16M#此參數(shù)確定數(shù)據(jù)日志文件的大小,以M為單位,更大的設(shè)置可以提高性能,但也會(huì)增加恢復(fù)故障數(shù)據(jù)庫(kù)所需的時(shí)間innodb_log_file_size = 128M#為提高性能,MySQL可以以循環(huán)方式將日志文件寫(xiě)到多個(gè)文件。推薦設(shè)置為3Minnodb_log_files_in_group = 3#推薦閱讀 http://www.taobaodba.com/html/221_innodb_max_dirty_pages_pct_checkpoint.html# Buffer_Pool中Dirty_Page所占的數(shù)量,直接影響InnoDB的關(guān)閉時(shí)間。參數(shù)innodb_max_dirty_pages_pct 可以直接控制了Dirty_Page在Buffer_Pool中所占的比率,而且幸運(yùn)的是innodb_max_dirty_pages_pct是可以動(dòng)態(tài)改變的。所以,在關(guān)閉InnoDB之前先將innodb_max_dirty_pages_pct調(diào)小,強(qiáng)制數(shù)據(jù)塊Flush一段時(shí)間,則能夠大大縮短 MySQL關(guān)閉的時(shí)間。innodb_max_dirty_pages_pct = 90# InnoDB 有其內(nèi)置的死鎖檢測(cè)機(jī)制,能導(dǎo)致未完成的事務(wù)回滾。但是,如果結(jié)合InnoDB使用MyISAM的lock tables 語(yǔ)句或第三方事務(wù)引擎,則InnoDB無(wú)法識(shí)別死鎖。為消除這種可能性,可以將innodb_lock_wait_timeout設(shè)置為一個(gè)整數(shù)值,指示 MySQL在允許其他事務(wù)修改那些最終受事務(wù)回滾的數(shù)據(jù)之前要等待多長(zhǎng)時(shí)間(秒數(shù))innodb_lock_wait_timeout = 120#獨(dú)享表空間(關(guān)閉)innodb_file_per_table = 0#start mysqld with –slow-query-log-file=/data/mysql/3306/slow.logslow_query_loglong_query_time = 1replicate-ignore-db = mysqlreplicate-ignore-db = testreplicate-ignore-db = information_schema#配置從庫(kù)上的更新操作是否寫(xiě)二進(jìn)制文件,如果這臺(tái)從庫(kù),還要做其他從庫(kù)的主庫(kù),那么就需要打這個(gè)參數(shù),以便從庫(kù)的從庫(kù)能夠進(jìn)行日志同步這個(gè)參數(shù)要和—logs-bin一起使用log-slave-updateslog-bin = /data/mysql/3306/binlog/binlogbinlog_cache_size = 4M#STATEMENT,ROW,MIXED# 基于SQL語(yǔ)句的復(fù)制(statement-based replication, SBR),基于行的復(fù)制(row-based replication, RBR),混合模式復(fù)制(mixed-based replication, MBR)。相應(yīng)地,binlog的格式也有三種:STATEMENT,ROW,MIXED。binlog_format = MIXEDmax_binlog_cache_size = 64Mmax_binlog_size = 1Grelay-log-index = /data/mysql/3306/relaylog/relaylogrelay-log-info-file = /data/mysql/3306/relaylog/relaylogrelay-log = /data/mysql/3306/relaylog/relaylogexpire_logs_days = 30skip-name-resolve#master-connect-retry = 10slave-skip-errors = 1032,1062,126,1114,1146,1048,1396server-id = 1[mysqldump]quickmax_allowed_packet = 32M[myisamchk]key_buffer_size = 256Msort_buffer_size = 256Mread_buffer = 2Mwrite_buffer = 2M[mysqlhotcopy]interactive-timeout轉(zhuǎn)自:http://blog.csdn.net/xujinyang/article/details/7276996
標(biāo)簽:
MySQL
數(shù)據(jù)庫(kù)
相關(guān)文章:
1. 數(shù)據(jù)庫(kù)相關(guān)的幾個(gè)技能:ACCESS轉(zhuǎn)SQL2. mysql的like模式3. Mysql入門(mén)系列:對(duì)MYSQL查詢中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼4. Mysql入門(mén)系列:建立MYSQL客戶機(jī)程序的一般過(guò)程5. 詳解MySQL中的數(shù)據(jù)類型和schema優(yōu)化6. Sql Server2005學(xué)習(xí)日記(01)7. 教你快速確定SQL Server欄中的最大值8. 經(jīng)驗(yàn)分享:Informix和Oracle存儲(chǔ)過(guò)程的異同9. mysql查詢表是否被鎖的方法10. 盤(pán)點(diǎn)SqlServer 分頁(yè)方式和拉姆達(dá)表達(dá)式分頁(yè)
排行榜
