實驗環境html
OS: debian_version_8.11 64位 CPU: Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz Mem: 8GB Kernel: 3.16.0-10-amd64 Mariadb: mariadb-10.2.30
說明:
一、MariaDB/MySQL的默認設置性能很是差,僅僅起一個功能測試的做用,不能用在生產環境中,所以要對一些參數進行調整優化。
二、可是配置文件各參數的調整須要根據實際環境,不一樣時期不一樣數量級的數據進行性能優化。
三、本文MySQL/MariaDB配置文件位於/etc/mysql/my.cnf。 每次更改此文件後你須要重啓MySQL服務,以更改生效。
四、經供參考,在生產環境中進行任何變動以前須要慎重考慮。mysql
配置文件參數解讀
[client]
port = 3306linux
#客戶端默認鏈接端口socket
socket = /apps/mysql/lock/mysql.socksql
#用於本地鏈接的socket套接字
[mysqld]數據庫
#服務端基本配置
port = 3306緩存
#mysql服務端監聽端口
socket = /apps/mysql/lock/mysql.sock安全
#爲mysql客戶端程序和服務器之間的本地通信指定一個套接字文件
basedir = /apps/mysql性能優化
#mysql安裝目錄
datadir = /apps/mysql/data服務器
#mysql數據庫數據文件存放目錄
pid-file = /apps/mysql/run/mysql.pid網絡
#pid所在的目錄
log-error = /apps/mysql/logs/mysql-error.log
#記錄mysql錯誤日誌文件
user = mysql
#mysql啓動用戶
bind-address=192.168.1.146
#表示監聽IPV4地址
skip_name_resolve = 1
#表示跳過主機名解析
skip-external-locking
#mysql選項以免外部鎖定。該選項默認開啓。不使用系統鎖定,要使用myisamchk,必須關閉服務器
key_buffer_size = 384M
#這個參數用來緩存MyISAM存儲引擎的索引參數,增長它可獲得更好處理的索引(對全部讀和多重寫)。默認爲InnoDB存儲引擎,該參數能夠設置小點,64M便可。 #系統將開始換頁而且真的變慢了。對於內存在4GB左右的服務器該參數可設置爲384M或512M。經過檢查狀態值Key_read_requests和Key_reads, #能夠知道key_buffer_size設置是否合理。比例key_reads/key_read_requests應該儘量的低, #至少是1:100,1:1000更好(上述狀態值可使用SHOW STATUS LIKE 'key_read%'得到)。注意:該參數值設置的過大反而會是服務器總體效率下降
max_allowed_packet = 16M
#容許最大接收數據包的大小,防止服務器發送過大的數據包。增長該變量的值十分安全,這是由於僅當須要時纔會分配額外內存。例如僅當你發出長查詢或mysqld必須返回大的結果行時mysqld纔會分配更多內存。能夠設置爲16MB或者更大,但設置的太大也可能有危險。 #該變量之因此取較小默認值是一種預防措施,以捕獲客戶端和服務器之間的錯誤信息包,並確保不會因偶然使用大的信息包而致使內存溢出。
table_open_cache = 512
#MySQL每打開一個表,都會讀入一些數據到table_open_cache緩存中,當MySQL在這個緩存中找不到相應信息時,纔會去磁盤上讀取。默認值64,假定系統有200個併發鏈接,則需將此參數設置爲200*N(N爲每一個鏈接所需的文件描述符數目);當把table_open_cache設置爲很大時,若是系統處理不了那麼多文件描述符,那麼就會出現客戶端失效,鏈接不上。
back_log = 600
#MySQL能有的鏈接數量。當主要MySQL線程在一個很短期內獲得很是多的鏈接請求,這就起做用, #而後主線程花些時間(儘管很短)檢查鏈接而且啓動一個新線程。back_log值指出在MySQL暫時中止回答新請求以前的短期內多少個請求能夠被存在堆棧中。 #若是指望在一個短期內有不少鏈接,你須要增長它。也就是說,若是MySQL的鏈接數據達到max_connections時,新來的請求將會被存在堆棧中, #以等待某一鏈接釋放資源,該堆棧的數量即back_log,若是等待鏈接的數量超過back_log,將不被授予鏈接資源。 #另外,這值(back_log)限於您的操做系統對到來的TCP/IP鏈接的偵聽隊列的大小。 #你的操做系統在這個隊列大小上有它本身的限制(能夠檢查你的OS文檔找出這個變量的最大值),試圖設定back_log高於你的操做系統的限制將是無效的。
sort_buffer_size = 8M
#MySQL執行排序使用的緩衝大小。若是想要增長ORDER BY的速度,首先看是否可讓MySQL使用索引而不是額外的排序階段。 #若是不能,能夠嘗試增長sort_buffer_size變量的大小,默認爲256k。另外,通常出現Using filesort的時候,要經過增長索引來解決。
read_buffer_size = 2M
#該參數用於表的順序掃描,表示每一個線程分配的緩衝區大小。好比在進行全表掃描時,MySQL會按照數據的存儲順序依次讀取數據塊,每次讀取的數據塊首先會暫存在read_buffer_size中,當buffer空間被寫滿或者所有數據讀取結束後,再將buffer中的數據返回給上層調用者,以提升效率。默認爲128K,這個參數不要設置過大,通常在128~256之間。若是對錶的順序掃描請求很是頻繁,而且你認爲頻繁掃描進行得太慢,能夠經過增長該變量值以及內存緩衝區大小提升其性能
read_rnd_buffer_size = 8M
#該參數用於表的隨機讀取,表示每一個線程分配的緩衝區大小。好比按照一個非索引字段作order by排序操做時,就會利用這個緩衝區來暫存讀取的數據。默認爲256KB,這個參數不要設置過大,通常在128~512KB。 #mysql會首先掃描一遍該緩衝,以免磁盤搜索,提升查詢速度,若是須要排序大量數據,可適當調高該值。但MySQL會爲每一個客戶鏈接發放該緩衝空間,因此應儘可能適當設置該值,以免內存開銷過大。
myisam_sort_buffer_size = 64M
#MyISAM設置恢復表之時使用的緩衝區的尺寸,當在REPAIR TABLE或用CREATE INDEX建立索引或ALTER TABLE過程當中排序MyISAM索引分配的緩衝區設置過小時可能會遇到」 myisam_sort_buffer_size is too small」
myisam_max_sort_file_size = 10G
#若是臨時文件會變得超過索引,不要使用快速排序索引方法來建立一個索引。註釋:這個參數以字節的形式給出
myisam_repair_threads = 1
#若是該值大於1,在Repair by sorting過程當中並行建立MyISAM表索引(每一個索引在本身的線程內)
thread_cache_size = 64
#線程池,線程緩存。用來緩存空閒的線程,以致於不被銷燬,若是線程緩存在的空閒線程,須要從新創建新鏈接,則會優先調用線程池中的緩存,很快就能響應鏈接請求。每創建一個鏈接,都須要一個線程與之匹配。 #這個值(默認8)表示能夠從新利用保存在緩存中線程的數量,當斷開鏈接時若是緩存中還有空間,那麼客戶端的線程將被放到緩存中, #若是線程從新被請求,那麼請求將從緩存中讀取,若是緩存中是空的或者是新的請求,那麼這個線程將被從新建立,若是有不少新的線程, #增長這個值能夠改善系統性能.經過比較Connections和Threads_created狀態的變量,能夠看到這個變量的做用。(–>表示要調整的值) #根據物理內存設置規則以下: #1G —> 8 #2G —> 16 #3G —> 32 #大於3G —> 64
query_cache_size = 32M
#緩存select語句和結果集大小的參數,查詢緩存會存儲一個select查詢的文本與被傳送到客戶端的相應結果。若是以後接收到一個相同的查詢,服務器會從查詢緩存中檢索結果,而不是再次分析和執行這個一樣的查詢。若是你的環境中寫操做不多,讀操做頻繁,那麼打開query_cache_type=1,會對性能有明顯提高。若是寫操做頻繁,則應該關閉它(query_cache_type=0)。 #從此對於一樣的SELECT語句(區分大小寫),將直接從緩衝區中讀取結果。根據MySQL用戶手冊,使用查詢緩衝最多能夠達到238%的效率。 #經過檢查狀態值'Qcache_%',能夠知道query_cache_size設置是否合理:若是Qcache_lowmem_prunes的值很是大,則代表常常出現緩衝不夠的狀況, #若是Qcache_hits的值也很是大,則代表查詢緩衝使用很是頻繁,此時須要增長緩衝大小;若是Qcache_hits的值不大,則代表你的查詢重複率很低, #這種狀況下使用查詢緩衝反而會影響效率,那麼能夠考慮不用查詢緩衝。此外,在SELECT語句中加入SQL_NO_CACHE能夠明確表示不使用查詢緩衝
query_cache_limit = 2M
#指定單個查詢可以使用的緩衝區大小,默認1M。
tmp_table_size = 64M
#臨時HEAP數據表的最大長度(默認設置是32M), #MySQL的heap(堆積)表緩衝大小。全部聯合在一個DML指令內完成,而且大多數聯合甚至能夠不用臨時表便可以完成。 #大多數臨時表是基於內存的(HEAP)表。具備大的記錄長度的臨時表 (全部列的長度的和)或包含BLOB列的表存儲在硬盤上。 #若是某個內部heap(堆積)表大小超過tmp_table_size,MySQL能夠根據須要自動將內存中的heap表改成基於硬盤的MyISAM表。還能夠經過設置tmp_table_size選項來增長臨時表的大小。也就是說,若是調高該值,MySQL同時將增長heap表的大小,可達到提升聯接查詢速度的效果
join_buffer_size = 64M
#聯合查詢操做所能使用的緩衝區大小,和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享
thread_concurrency = 4
#該值通常建議設定cpu的個數*2
ft_min_word_len = 4
#分詞詞彙最小長度,默認值爲4
explicit_defaults_for_timestamp = true
#是否顯示默認時間戳,true是顯示
#skip-networking
max_connections = 1000
#該參數是用來設定mysql的最大鏈接數,默認爲100,通常設置爲512-1000便可。太多的鏈接會致使內存的使用量太高而且會鎖住你的MySQL服務器。通常小型網站須要100-200的鏈接數,而較大可能須要500-800甚至更多。這裏的值很大程度上取決於你 MySQL/MariaDB 的使用狀況。 #若是服務器的併發鏈接請求量比較大,建議調高此值,以增長並行鏈接數量,固然這創建在機器能支撐的狀況下,由於若是鏈接數越多,介於MySQL會爲每一個鏈接提供鏈接緩衝區,就會開銷越多的內存,因此要適當調整該值,不能盲目提升設值。能夠過'conn%'通配符查看當前狀態的鏈接數量,以定奪該值的大小。
max_connect_errors = 1000
#若是有時網絡異常或者應用配置錯誤,或者其餘緣由致使客戶端短期內不斷的嘗試鏈接,超出該參數值個數的中斷錯誤鏈接。該主機將被禁止鏈接,可能會被列入黑名單。而後將沒法鏈接,直到再次刷新主機緩存。如需對該主機進行解禁需執行FLUSH HOST。這個選項默認值過小了,能夠考慮設的足夠大(若是你的服務器配置夠強大的話)。
open_files_limit = 65535
#設定mysql打開最大文件數,MySQL打開的文件描述符限制,默認最小1024,當open_files_limit沒有被配置的時候,比較max_connections*5和ulimit -n的值,哪一個大用哪一個。
transaction_isolation = REPEATABLE-READ
#MySQL支持4種事務隔離級別,他們分別是:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE。 #如沒有指定,MySQL默認採用的是REPEATABLE-READ,ORACLE默認的是READ-COMMITTED
log-bin=mysql-bin
binlog_format=mixed
#指定日誌格式爲mixed
binlog_cache_size = 64M
#一個事務在沒有提交的時候產生的日誌會記錄到Cache中;等到事務提交須要提交的時候,則把日誌持久化到磁盤。該值默認大小32K,能夠自行設定。
max_heap_table_size = 8M
#定義了用戶能夠建立的內存表(memory table)的大小。這個值用來計算內存表的最大行數值。這個變量支持動態改變
server-id = 1
#表示是本機的序號爲1,給服務器分配一個獨一無二的ID編號; n的取值範圍是1~2的32次方啓用二進制日誌功能。在複製數據同步的時候會用到,通常來說就是master的意思
expire_logs_days = 30
#表示超過30天的binlog刪除,啓用二進制日誌後保留日誌的天數。服務器會自動清理指定天數前的日誌文件,若是不設置則會致使服務器空間耗盡。通常設置爲7~30天。
default_storage_engine = InnoDB
#新數據表的默認存儲引擎(默認設置是MyISAM)。這項設置還能夠經過–default-table-type選項來設置。
innodb_file_per_table = 1
#InnoDB爲獨立表空間模式,每一個數據庫的每一個表都會生成一個數據空間。當刪除或截斷一個數據庫表時,你也能夠回收未使用的空間。這樣配置的另外一個好處是你能夠將某些數據庫表放在一個單獨的存儲設備。這能夠大大提高你磁盤的I/O負載。 #獨立表空間優勢: #1.每一個表都有自已獨立的表空間。 #2.每一個表的數據和索引都會存在自已的表空間中。 #3.能夠實現單表在不一樣的數據庫中移動。 #4.空間能夠回收(除drop table操做處,表空不能自已回收) #缺點: #單表增長過大,如超過100G #結論: #共享表空間在Insert操做上少有優點。其它都沒獨立表空間表現好。當啓用獨立表空間時,請合理調整:innodb_open_files
innodb_data_home_dir = /apps/mysql/data
#InnoDB主目錄,全部與InnoDB數據表有關的目錄或文件路徑都相對於這個路徑。在默認的狀況下,這個主目錄就是MySQL的數據目錄。
innodb_data_file_path = ibdata1:10M:autoextend
#用來容納InnoDB爲數據表的表空間: 可能涉及一個以上的文件; 每個表空間文件的最大長度都必須以字節(B)、兆字節(MB)或千兆字節(GB)爲單位給出; 表空間文件的名字必須以分號隔開; 最後一個表空間文件還能夠帶一個autoextend屬性和一個最大長度(max:n)。
innodb_log_group_home_dir = /apps/mysql/logs
#用來存放InnoDB日誌文件的目錄路徑(如ib_logfile0、ib_logfile1等)。在默認的狀況下,InnoDB驅動程序將使用 MySQL數據目錄做爲本身保存日誌文件的位置。
innodb_buffer_pool_size = 4G
#這個參數是InnoDB存儲引擎的核心參數,默認爲128KB #InnoDB使用一個緩衝池來保存索引和原始數據, 不像MyISAM. #這裏你設置越大,你在存取表裏面數據時所須要的磁盤I/O越少. #在一個獨立使用的數據庫服務器上,你能夠設置這個變量到服務器物理內存大小的60-80% #不要設置過大,不然,因爲物理內存的競爭可能致使操做系統的換頁顛簸. #注意在32位系統上你每一個進程可能被限制在 2-3.5G 用戶層面內存限制, #因此不要設置的過高.
innodb_write_io_threads = 4
innodb_read_io_threads = 4
#Innodb使用後臺線程處理數據頁上的讀寫 I/O(輸入輸出)請求,根據你的 CPU 核數來更改,默認是4 #注:這兩個參數不支持動態改變,須要把該參數加入到my.cnf裏,修改完後重啓MySQL服務,容許值的範圍從1-64
innodb_thread_concurrency = 0
#默認設置爲0,表示不限制併發數,這裏推薦設置爲0,更好去發揮CPU多核處理能力,提升併發量
innodb_purge_threads = 1
#InnoDB中的清除操做是一類按期回收無用數據的操做。在以前的幾個版本中,清除操做是主線程的一部分,這意味着運行時它可能會堵塞其它的數據庫操做。 #從MySQL5.5.X版本開始,該操做運行於獨立的線程中,並支持更多的併發數。用戶可經過設置innodb_purge_threads配置參數來選擇清除操做是否使用單 #獨線程,默認狀況下參數設置爲0(不使用單獨線程),設置爲 1 時表示使用單獨的清除線程。建議爲1
innodb_log_file_size = 1G
#事務日誌文件寫操做緩存區的最大長度(默認設置是1MB)。更大的設置能夠提升性能,但也會增長恢復故障數據庫所需的時間
innodb_log_files_in_group = 3
#爲提升性能,MySQL能夠以循環方式將日誌文件寫到多個文件。推薦設置爲3
innodb_max_dirty_pages_pct = 90
#innodb主線程刷新緩存池中的數據,使髒數據比例小於90%
innodb_strict_mode = 0
innodb_log_buffer_size = 64M
#此參數肯定些日誌文件所用的內存大小,以M爲單位。緩衝區更大能提升性能,但意外的故障將會丟失數據。事務日誌所使用的緩存區。InnoDB在寫事務日誌的時候爲了提升性能,先將信息寫入Innodb Log Buffer中,當知足innodb_flush_log_trx_commit參數所設置的相應條件(或者日誌緩衝區寫滿)時,再將日誌寫到文件(或者同步到磁盤)中。能夠經過innodb_log_buffer_size參數設置其可使用的最大內存空間。默認是8MB,通常爲16~64MB便可。
innodb_flush_log_at_trx_commit = 1
#這個選項決定着何時把日誌信息寫入日誌文件以及何時把這些文件物理地寫(術語稱爲」同步」)到硬盤上。 #0: 若是innodb_flush_log_at_trx_commit的值爲0,log buffer每秒就會被刷寫日誌文件到磁盤,提交事務的時候不作任何操做(執行是由mysql的master thread線程來執行的。 #主線程中每秒會將重作日誌緩衝寫入磁盤的重作日誌文件(REDO LOG)中。不論事務是否已經提交)默認的日誌文件是ib_logfile0,ib_logfile1 #1: 當設爲默認值1的時候,每次提交事務的時候,都會將log buffer刷寫到日誌。 #2: 若是設爲2,每次提交事務都會寫日誌,但並不會執行刷的操做。每秒定時會刷到日誌文件。要注意的是,並不能保證100%每秒必定都會刷到磁盤,這要取決於進程的調度。 #每次事務提交的時候將數據寫入事務日誌,而這裏的寫入僅是調用了文件系統的寫入操做,而文件系統是有 緩存的,因此這個寫入並不能保證數據已經寫入到物理磁盤 #默認值1是爲了保證完整的ACID。固然,你能夠將這個配置項設爲1之外的值來換取更高的性能,可是在系統崩潰的時候,你將會丟失1秒的數據。 #設爲0的話,mysqld進程崩潰的時候,就會丟失最後1秒的事務。設爲2,只有在操做系統崩潰或者斷電的時候纔會丟失最後1秒的數據。InnoDB在作恢復的時候會忽略這個值。 #總結 #設爲1固然是最安全的,但性能頁是最差的(相對其餘兩個參數而言,但不是不能接受)。若是對數據一致性和完整性要求不高,徹底能夠設爲2,若是隻最求性能,例如高併發寫的日誌服務器,設爲0來得到更高性能
innodb_lock_wait_timeout = 50
#若是某個事務在等待n秒(s)後尚未得到所須要的資源,就使用ROLLBACK命令放棄這個事務。這項設置對於發現和處理未能被InnoDB數據表驅動 程序識別出來的死鎖條件有着重要的意義。 #InnoDB事務在被回滾以前能夠等待一個鎖定的超時秒數。InnoDB在它本身的鎖定表中自動檢測事務死鎖而且回滾事務。InnoDB用LOCK TABLES語句注意到鎖定設置。默認值是50秒
interactive_timeout = 28800
#服務器關閉交互式鏈接前等待活動的秒數。交互式客戶端定義爲在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。默認值:28800秒(8小時)
wait_timeout = 28800
#服務器關閉非交互鏈接以前等待活動的秒數。在線程啓動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值, #取決於客戶端類型(由mysql_real_connect()的鏈接選項CLIENT_INTERACTIVE定義)。參數默認值:28800秒(8小時) #MySQL服務器所支持的最大鏈接數是有上限的,由於每一個鏈接的創建都會消耗內存,所以咱們但願客戶端在鏈接到MySQL Server處理完相應的操做後, #應該斷開鏈接並釋放佔用的內存。若是你的MySQL Server有大量的閒置鏈接,他們不只會白白消耗內存,並且若是鏈接一直在累加而不斷開, #最終確定會達到MySQL Server的鏈接上限數,這會報'too many connections'的錯誤。對於wait_timeout的值設定,應該根據系統的運行狀況來判斷 #在系統運行一段時間後,能夠經過show processlist命令查看當前系統的鏈接狀態,若是發現有大量的sleep狀態的鏈接進程,則說明該參數設置的過大, #能夠進行適當的調整小些。要同時設置interactive_timeout和wait_timeout纔會生效。
[mysqldump]
quick
max_allowed_packet = 16M
#服務器發送和接受的最大包長度
[mysql]
no-auto-rehash
auto-rehash是自動補全的意思,就像咱們在linux命令行裏輸入命令的時候,使用tab鍵的功能是同樣的。
[myisamchk]
key_buffer_size = 384M
sort_buffer_size = 256M
read_buffer = 128M
write_buffer = 128M
[mysqlhotcopy]
interactive-timeout
#服務器關閉交互式鏈接前等待活動的秒數。交互式客戶端定義爲在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。默認值:28800秒(8小時)
示例.內存8G的my.cnf完整配置:
cat /etc/mysql/my.cnf
#The following options will be passed to all MySQL clients [client] port = 3306 socket = /apps/mysql/lock/mysql.sock #The MySQL server [mysqld] port = 3306 socket = /apps/mysql/lock/mysql.sock basedir = /apps/mysql datadir = /apps/mysql/data pid-file = /apps/mysql/run/mysql.pid log-error = /apps/mysql/logs/mysql-error.log user = mysql bind-address=192.168.1.146 skip_name_resolve = 1 skip-external-locking key_buffer_size = 384M max_allowed_packet = 16M table_open_cache = 512 back_log = 600 sort_buffer_size = 8M read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 thread_cache_size = 64 query_cache_size = 32M query_cache_limit = 2M tmp_table_size = 64M join_buffer_size = 64M thread_concurrency = 4 ft_min_word_len = 4 explicit_defaults_for_timestamp = true #skip-networking max_connections = 1000 max_connect_errors = 1000 open_files_limit = 65535 transaction_isolation = REPEATABLE-READ log-bin=mysql-bin binlog_format=mixed binlog_cache_size = 64M max_heap_table_size = 8M server-id = 1 expire_logs_days = 30 default_storage_engine = InnoDB innodb_file_per_table = 1 innodb_data_home_dir = /apps/mysql/data innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /apps/mysql/logs/ innodb_buffer_pool_size = 4G innodb_write_io_threads = 4 innodb_read_io_threads = 4 innodb_thread_concurrency = 0 innodb_purge_threads = 1 innodb_log_file_size = 1G innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_strict_mode = 0 innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 interactive_timeout = 28800 wait_timeout = 28800 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 384M sort_buffer_size = 256M read_buffer = 128M write_buffer = 128M [mysqlhotcopy] interactive-timeout
參考連接
https://blog.csdn.net/qq_1512...
https://linuxeye.com/379.html