您好,登錄后才能下訂單哦!
小編給大家分享一下mysql數據庫中my.cnf配置文件重要參數優化配置的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
MyISAM存儲引擎
MyISAM存儲引擎適用于讀多寫少,對讀性能要求比較高的系統
官方文檔:http://dev.mysql.com/doc/refman/5.6/en/myisam-storage-engine.html
Key_buffer_size,可以設置為內存的30%-40%左右。通過show variables like ‘%key_buffer_size%';
通過 show global status like ‘%key_blocks_unused%' 查看是否還有剩余,如果剩余很多,就不需要再加大key_buffer_size了
如果不用MyISAM,建議設置16m到32m就可以了
Query_cache 如果應用程序有大量讀且應用程序級別沒有緩存,設置這個會比較有用,但是也別太大,維護開銷比較大,mysql反而會變慢,建議32m到512m
Sort_buffer_size當進行復雜查詢時候用到,建議8m到16m
Query_cache_size緩存select查詢結果,如果有大量相同查詢,可以將這個值加大。
Bulk_insert_buffer_size 批量insert時候使用,必須小于key_buffer_size
Read_rnd_buffer_size sql有order by的情況下并且第二次查詢時候就會用到,他會記錄排序,將直接從內存中讀取。
Thread_cache_size cache中保留多少線程重用,如果再設置的值內,線程斷開也不會銷毀,等待新鏈接。減少線程創建的開銷。
參數官方參考文檔:http://dev.mysql.com/doc/refman/5.6/en/optimizing-myisam.html
Innodb 存儲引擎
Innodb 存儲引擎 1
并發線程數:Innodb_thread_concurrency=0[默認],并不是說沒有并發,而是指無限并發,沒有并發檢查。innodb內部自己控制
取值0到1000
建議:
Cpu數量+磁盤數量 * 2,如果有RAID主備,就不乘2,因為有備份磁盤
Innodb 存儲引擎 2
Innodb_io_capacity默認值是200,個人認為是表示磁盤IO的吞吐量,innodb每秒后臺進程處理IO操作的數據頁上限
Innodb_io_capacity_max默認2000,設置IO上線
源碼:在innodb存儲引擎層搜索srv_io_capacity(主要在srv0srv.c文件中)
當使用SSD可以再調高一些,直到符合磁盤IO吞吐量即可
Innodb 存儲引擎 3
innodb_max_dirty_pages_pct innodb從innodb buffer中刷新臟頁的比例15% - 80%
源碼:在innodb存儲引擎層搜索srv_max_buf_pool_modified_pct(主要在srv0srv.c文件中)
Innodb 存儲引擎 4 [重要]
innodb_flush_method( O_DSYNC 、 O_DIRECT )
O_DSYNC:InnoDB使用O_SYNC模式打開并更新日志文件,用fsync()函數去更新數據文件。
O_DIRECT:InnoDB使用O_DIRECT模式打開數據文件,用fsync()函數去更新日志和數據文件
在raid設備上,為了避免數據被innodb_buffer和raid多次cache,設置為O_DIRECT方式。也就是說直接打開數據文件,不用打開日志文件了。
源碼:在innodb存儲引擎層搜索srv_unix_file_flush_method(主要在log0log.c、os0file.c文件中)
Innodb 存儲引擎 5 【重要】
innodb_buffer_pool_size
Innodb會遵循lru,在錄入數據的時候會根據數據的情況,會加載到innodb_buffer_pool_size 中。如果操作數據的時候就省去了去數據文件中查找,直接從內存中找到了。
一般設置內存的80%左右,但需要考慮數據文件的總量是多大。Buffer_pool_size + 數據量所占容量 + 操作系統所用內存 = 內存大小。盡可能設置多一些。
源碼:在innodb存儲引擎層搜索srv_buf_pool_size(在srv0srv.c、srv0start.c文件中)。
Innodb 存儲引擎 6
innodb_buffer_pool_instances 當有多實例的情況下,需要設置。
源碼:在innodb存儲引擎層搜索srv_buf_pool_instances(主要集中在的buf0buf.c文件)
Innodb 存儲引擎 7
innodb_log_file_size 日志文件大小
innodb_log_buffer_size 日志緩存大小
先寫入innodb_log_buffer,buffer寫滿或事務提交,刷新數據,大事務頻繁,增加innodb_log_buffer_size大小,默認16M。
源碼:在innodb存儲引擎層搜索srv_log_buffer_size(主要在log0log.c文件中)
Innodb 存儲引擎 8 【重要】
Innodb_file_per_table
當設置Innodb_file_per_table 為1時為打開狀態,也就是設置所有表為獨立表空間,一個表一個存儲數據文件。同時要設置
Innodb_open_files(同時打開文件數)。因為每個表對應一個數據文件,所以需要設置同時打開文件的數量以保證查詢多表的情況,并且想要把某個表移出的別的磁盤時共享表空間是無法遷移的,因為所有表都使用著共享表空間。
默認是所有表都放到共享空間中。也就是OFF
innodb 存儲引擎9
Innodb_flush_log_at_trx_commit 核心參數:
0:每秒將log buffer的內容寫事務日志并且刷新到磁盤
1:每個事務提交后,將log buffer的內容寫事務日志并寫入數據磁盤
2:每個事務提交,將log buffer內容寫事務日志,但是不進行數據刷盤
Sync_binlog
雙一致模式: innodb_flush_log_at_trx_commit=1;sync_binlog=1;這樣的主從數據是一致的,不會丟數據。
官方參數描述地址: http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html
系統參數優化
NUMA(雙實例下,可以把每一個實例放到numa單獨控制的節點下面)
在os層numa關閉時,打開bios層的numa會影響性能,QPS會下降15-30%左右;
在bios層面numa關閉是,無論os層面的numa是否打開,都不會影響性能。
系統優化 jemalloc
網卡優化:RPS+RFS
malloc
1)、下載jemalloc源碼包
wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2
tar -xjf jemalloc-3.6.0.tar.bz2
2)、編譯安裝
cd jemalloc-3.6.0; ./configure;make &make install
3)、配置MySQL
[mysqld_safe]
malloc-lib=$PATH/libjemalloc.so
4)、參考文檔:http://blog.chinaunix.net/uid-29957450-id-4547818.html
my.cnf配置文件參考
# 以下選項會被MySQL客戶端應用讀取。 # 注意只有MySQL附帶的客戶端應用程序保證可以讀取這段內容。 # 如果你想你自己的MySQL應用程序獲取這些值。 # 需要在MySQL客戶端庫初始化的時候指定這些選項。 [client] port = 3306 socket = /usr/local/mysql/mysql.sock # MySQL 服務端 [mysqld] #默認存儲引擎INNODB default-storage-engine=INNODB #GROUP_CONCAT長度 group_concat_max_len =99999 #端口號 port = 3306 #socket位置 socket = /usr/local/mysql/mysql.sock #pid寫入文件位置 pid-file = /usr/local/mysql/mysqld.pid #數據庫文件位置 datadir = /home/data/mysql/data user = mysql #SQL模式具體查閱相關資料 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #當外部鎖定(external-locking)起作用時,每個進程若要訪問數據表, #則必須等待之前的進程完成操作并解除鎖定。由于服務器訪問數據表時經常需要等待解鎖, #因此在單服務器環境下external locking會讓MySQL性能下降。 #所以在很多Linux發行版的源中,MySQL配置文件中默認使用了skip-external-locking來避免external locking。 skip-external-locking #跳過DNS反向解析 skip-name-resolve #關閉TIMESTAMP類型默認值 explicit_defaults_for_timestamp #不受client字符集影響,保證sever端字符集 skip-character-set-client-handshake #初始連接字符集UTF8 init-connect='SET NAMES utf8' #默認數據庫字符集 character-set-server=utf8 #查詢緩存0,1,2,分別代表了off、on、demand query_cache_type = 1 #單位秒,握手時間超過connect_timeout,連接請求將會被拒絕 connect_timeout = 20 #設置在多少秒沒收到主庫傳來的Binary Logs events之后,從庫認為網絡超時,Slave IO線程會重新連接主庫。 #該參數的默認值是3600s ,然而時間太久會造成數據庫延遲或者主備庫直接的鏈接異常不能及時發現。 #將 slave_net_timeout 設得很短會造成 Master 沒有數據更新時頻繁重連。一般線上設置為5s slave_net_timeout = 30 #這個參數用來配置從服務器的更新是否寫入二進制日志,這個選項默認是不打開的, #但是,如果這個從服務器B是服務器A的從服務器,同時還作為服務器C的主服務器,那么就需要開發這個選項, #這樣它的從服務器C才能獲得它的二進制日志進行同步操作 log-slave-updates=1 #用于slave服務器,io線程會把server id與自己相同的event寫入日志,與log-slave-updates選項沖突 replicate-same-server-id=0 # 對了生成唯一的server_id我想到了,大家ip地址唯一,比如10.112.87.91 ,就直接去掉點號在后面加上編號01或者02或者03(加上2位數編號是怕一臺物理機 滄岸嗍道,主從復制需要server-id來標識的 # 用10112879101做server_id就可以了。 server_id=10112879101 # 打開二進制日志功能. # 在復制(replication)配置中,作為MASTER主服務器必須打開此項 # 如果你需要從你最后的備份中做基于時間點的恢復,你也同樣需要二進制日志 log-bin =/home/data/mysql/binlog/mysql-bin.log #relay-log日志 relay-log=mysql-relay-bin #master-info-repository以及relay-log-info-repository打開以啟用崩潰安全的二進制日志/從服務器功能(在事務表而不是平面文件中存儲信息) master-info-repository=TABLE relay-log-info-repository=TABLE #不寫入binlog二進制日志中的數據庫 binlog-ignore-db=mysql # No sync databases binlog-ignore-db=test # No sync databases binlog-ignore-db=information_schema # No sync databases binlog-ignore-db=performance_schema # No sync databases #寫入binlog二進制日志中數據庫 binlog-do-db=business_db binlog-do-db=user_db binlog-do-db=plocc_system #15滾動清理binlog expire-logs-days=15 max_binlog_size = 1073741824 # Bin logs size ( 1G ) #使binlog在每1000次binlog寫入后與硬盤同步 sync_binlog = 1000 #指定只復制哪個庫的數據 replicate-do-db=business_db replicate-do-db=user_db replicate-do-db=plocc_system #開啟事件調度器Event Scheduler event_scheduler=1 #MySQL能暫存的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用。 #如果MySQL的連接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源, #該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源 back_log = 500 #整個數據庫最大連接(用戶)數 max_connections = 6000 #一個用戶的最大連接數 max_user_connection=3000 # 每個客戶端連接最大的錯誤允許數量,如果達到了此限制. # 這個客戶端將會被MySQL服務阻止直到執行了”FLUSH HOSTS” 或者服務重啟 # 非法的密碼以及其他在鏈接時的錯誤會增加此值. # 查看 “Aborted_connects” 狀態來獲取全局計數器 max_connect_errors = 1844674407370954751 #表描述符緩存大小,可減少文件打開/關閉次數 table_open_cache = 2048 # 服務所能處理的請求包的最大大小以及服務所能處理的最大的請求大小(當與大的BLOB字段一起工作時相當必要) # 每個連接獨立的大小.大小動態增加 max_allowed_packet = 64M # 在一個事務中binlog為了記錄SQL狀態所持有的cache大小 # 如果你經常使用大的,多聲明的事務,你可以增加此值來獲取更大的性能. # 所有從事務來的狀態都將被緩沖在binlog緩沖中然后在提交后一次性寫入到binlog中 # 如果事務比此值大, 會使用磁盤上的臨時文件來替代. # 此緩沖在每個連接的事務第一次更新狀態時被創建 binlog_cache_size = 1M # 獨立的內存表所允許的最大容量. # 此選項為了防止意外創建一個超大的內存表導致用盡所有的內存資源. max_heap_table_size = 1342177280 # 排序緩沖被用來處理類似ORDER BY以及GROUP BY隊列所引起的排序 # 如果排序后的數據無法放入排序緩沖, # 一個用來替代的基于磁盤的合并分類會被使用 # 查看 “Sort_merge_passes” 狀態變量. # 在排序發生時由每個線程分配 sort_buffer_size = 8M # 此緩沖被使用來優化全聯合(full JOINs 不帶索引的聯合). # 類似的聯合在極大多數情況下有非常糟糕的性能表現, # 但是將此值設大能夠減輕性能影響. # 通過 “Select_full_join” 狀態變量查看全聯合的數量 # 當全聯合發生時,在每個線程中分配 join_buffer_size = 8M # 我們在cache中保留多少線程用于重用 # 當一個客戶端斷開連接后,如果cache中的線程還少于thread_cache_size, # 則客戶端線程被放入cache中. # 這可以在你需要大量新連接的時候極大的減少線程創建的開銷 # (一般來說如果你有好的線程模型的話,這不會有明顯的性能提升.) thread_cache_size = 128 # 此允許應用程序給予線程系統一個提示在同一時間給予渴望被運行的線程的數量. # 此值只對于支持 thread_concurrency() 函數的系統有意義( 例如Sun Solaris). # 你可可以嘗試使用 [CPU數量]*(2..4) 來作為thread_concurrency的值 thread_concurrency = 8 # 查詢緩沖常被用來緩沖 SELECT 的結果并且在下一次同樣查詢的時候不再執行直接返回結果. # 打開查詢緩沖可以極大的提高服務器速度, 如果你有大量的相同的查詢并且很少修改表. # 查看 “Qcache_lowmem_prunes” 狀態變量來檢查是否當前值對于你的負載來說是否足夠高. # 注意: 在你表經常變化的情況下或者如果你的查詢原文每次都不同, # 查詢緩沖也許引起性能下降而不是性能提升. query_cache_size = 64M # 只有小于此設定值的結果才會被緩沖 # 此設置用來保護查詢緩沖,防止一個極大的結果集將其他所有的查詢結果都覆蓋 query_cache_limit = 2M # 被全文檢索索引的最小的字長. # 你也許希望減少它,如果你需要搜索更短字的時候. # 注意在你修改此值之后, # 你需要重建你的 FULLTEXT 索引 ft_min_word_len = 4 # 線程使用的堆大小. 此容量的內存在每次連接時被預留. # MySQL 本身常不會需要超過64K的內存 # 如果你使用你自己的需要大量堆的UDF函數 # 或者你的操作系統對于某些操作需要更多的堆, # 你也許需要將其設置的更高一點. thread_stack = 192K # 設定默認的事務隔離級別.可用的級別如下: # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE transaction_isolation = READ-COMMITTED # 內部(內存中)臨時表的最大大小 # 如果一個表增長到比此值更大,將會自動轉換為基于磁盤的表. # 此限制是針對單個表的,而不是總和. tmp_table_size = 1342177280 #binlog日志類型--混合型 binlog_format=mixed #開啟慢查詢日志 slow_query_log #文件格式 log_output = FILE # 所有的使用了比這個時間(以秒為單位)更多的查詢會被認為是慢速查詢. # 不要在這里使用”0″, 否則會導致所有的查詢,甚至非常快的查詢頁被記錄下來(由于MySQL 目前時間的精確度只能達到秒的級別). long_query_time = 0.5 #慢查詢日志位置 slow_query_log_file=/usr/local/mysql/mysqld_slow.log #指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度 #******************** MyISAM 相關選項******************************** # 關鍵詞緩沖的大小, 一般用來緩沖MyISAM表的索引塊. # 不要將其設置大于你可用內存的30%, # 因為一部分內存同樣被OS用來緩沖行數據 # 甚至在你并不使用MyISAM 表的情況下, 你也需要仍舊設置起 8-64M 內存由于它同樣會被內部臨時磁盤表使用. key_buffer_size = 32M # 用來做MyISAM表全表掃描的緩沖大小. # 當全表掃描需要時,在對應線程中分配. read_buffer_size = 2M # 當在排序之后,從一個已經排序好的序列中讀取行時,行數據將從這個緩沖中讀取來防止磁盤尋道. # 如果你增高此值,可以提高很多ORDER BY的性能. # 當需要時由每個線程分配 read_rnd_buffer_size = 8M # MyISAM 使用特殊的類似樹的cache來使得突發插入 # (這些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA # INFILE) 更快. 此變量限制每個進程中緩沖樹的字節數. # 設置為 0 會關閉此優化. # 為了最優化不要將此值設置大于 “key_buffer_size”. # 當突發插入被檢測到時此緩沖將被分配. bulk_insert_buffer_size = 16M # 此緩沖當MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一個空表中引起重建索引時被分配. # 這在每個線程中被分配.所以在設置大值時需要小心. myisam_sort_buffer_size = 128M # MySQL重建索引時所允許的最大臨時文件的大小 (當 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE). # 如果文件大小比此值更大,索引會通過鍵值緩沖創建(更慢) myisam_max_sort_file_size = 1G # 如果一個表擁有超過一個索引, MyISAM 可以通過并行排序使用超過一個線程去修復他們. # 這對于擁有多個CPU以及大量內存情況的用戶,是一個很好的選擇. myisam_repair_threads = 1 # 自動檢查和修復沒有適當關閉的 MyISAM 表. myisam_recover # *************** INNODB 相關選項 ********************* # 如果你的MySQL服務包含InnoDB支持但是并不打算使用的話, # 使用此選項會節省內存以及磁盤空間,并且加速某些部分 #skip-innodb # #####[關鍵項] # InnoDB使用一個緩沖池來保存索引和原始數據, 不像 MyISAM. # 這里你設置越大,你在存取表里面數據時所需要的磁盤I/O越少. # 在一個獨立使用的數據庫服務器上,你可以設置這個變量到服務器物理內存大小的80% # 不要設置過大,否則,由于物理內存的競爭可能導致操作系統的換頁顛簸. # 注意在32位系統上你每個進程可能被限制在 2-3.5G 用戶層面內存限制, # 所以不要設置的太高. innodb_buffer_pool_size = 700m #1G # InnoDB 將數據保存在一個或者多個數據文件中成為表空間. # 如果你只有單個邏輯驅動保存你的數據,一個單個的自增文件就足夠好了. # 其他情況下.每個設備一個文件一般都是個好的選擇. # 你也可以配置InnoDB來使用裸盤分區 – 請參考手冊來獲取更多相關內容 innodb_data_file_path = IBdata1:1024M;IBdata2:1024M:autoextend # 設置此選項如果你希望InnoDB表空間文件被保存在其他分區. # 默認保存在MySQL的datadir中. #innodb_data_home_dir = # 用來同步IO操作的IO線程的數量. This value is # 此值在Unix下被硬編碼為4,但是在Windows磁盤I/O可能在一個大數值下表現的更好. innodb_file_io_threads = 4 # 在InnoDb核心內的允許線程數量. # 最優值依賴于應用程序,硬件以及操作系統的調度方式. # 過高的值可能導致線程的互斥顛簸. innodb_thread_concurrency = 16 # #####[關鍵項] # 如果設置為1 ,InnoDB會在每次提交后刷新(fsync)事務日志到磁盤上, # 這提供了完整的ACID行為. # 如果你愿意對事務安全折衷, 并且你正在運行一個小的事務, 你可以設置此值到0或者2來減少由事務日志引起的磁盤I/O # 0代表日志只大約每秒寫入日志文件并且日志文件刷新到磁盤. # 2代表日志寫入日志文件在每次提交后,但是日志文件只有大約每秒才會刷新到磁盤上. # -------------------- # (說明:如果是游戲服務器,建議此值設置為2;如果是對數據安全要求極高的應用,建議設置為1; # 設置為0性能最高,但如果發生故障,數據可能會有丟失的危險! # 默認值1的意思是每一次事務提交或事務外的指令都需要把日志寫入(flush)硬盤,這是很費時的。 # 特別是使用電池供電緩存(Battery backed up cache)時。設成2對于很多運用,特別是從MyISAM表轉過來的是可以的, # 它的意思是不寫入硬盤而是寫入系統緩存。日志仍然會每秒flush到硬盤,所以你一般不會丟失超過1-2秒的更新。 # 設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值2只會在整個操作系統掛了時才可能丟數據) innodb_flush_log_at_trx_commit = 2 # 用來緩沖日志數據的緩沖區的大小. # 當此值快滿時, InnoDB將必須刷新數據到磁盤上. # 由于基本上每秒都會刷新一次,所以沒有必要將此值設置的太大(甚至對于長事務而言) innodb_log_buffer_size = 16M # 在日志組中每個日志文件的大小. # 你應該設置日志文件總合大小到你緩沖池大小的25%~100% # 來避免在日志文件覆寫上不必要的緩沖池刷新行為. # 不論如何, 請注意一個大的日志文件大小會增加恢復進程所需要的時間 innodb_log_file_size = 1024M # 在日志組中的文件總數. # 通常來說2~3是比較好的. innodb_log_files_in_group = 3 # InnoDB的日志文件所在位置. 默認是MySQL的datadir. # 你可以將其指定到一個獨立的硬盤上或者一個RAID1卷上來提高其性能 #innodb_log_group_home_dir # 在InnoDB緩沖池中最大允許的臟頁面的比例. # 如果達到限額, InnoDB會開始刷新他們防止他們妨礙到干凈數據頁面. # 這是一個軟限制,不被保證絕對執行. innodb_max_dirty_pages_pct = 90 # InnoDB用來刷新日志的方法. # 表空間總是使用雙重寫入刷新方法 # 默認值是 “fdatasync”, 另一個是 “O_DSYNC”. innodb_flush_method=O_DSYNC # 在被回滾前,一個InnoDB的事務應該等待一個鎖被批準多久. # InnoDB在其擁有的鎖表中自動檢測事務死鎖并且回滾事務. # 如果你使用 LOCK TABLES 指令, 或者在同樣事務中使用除了InnoDB以外的其他事務安全的存儲引擎 # 那么一個死鎖可能發生而InnoDB無法注意到. # 這種情況下這個timeout值對于解決這種問題就非常有幫助. innodb_lock_wait_timeout = 30 [mysqldump] # 不要在將內存中的整個結果寫入磁盤之前緩存. 在導出非常巨大的表時需要此項 quick max_allowed_packet = 64M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 512M sort_buffer_size = 512M read_buffer = 8M write_buffer = 8M [mysqlhotcopy] interactive-timeout [mysqld_safe] # 增加每個進程的可打開文件數量. # 警告: 確認你已經將全系統限制設定的足夠高! # 打開大量表需要將此值設大 open-files-limit = 8192 log-error=/usr/local/mysql/mysqld.log pid-file=/usr/local/mysql/mysqld.pid
以上是“mysql數據庫中my.cnf配置文件重要參數優化配置的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。