超詳細(xì)的MySQL數(shù)據(jù)庫(kù)參數(shù)優(yōu)化,都總結(jié)在這里了
作者:波波說(shuō)運(yùn)維
最近在對(duì)各個(gè)系統(tǒng)的mysql做一些參數(shù)上的優(yōu)化,也開(kāi)了慢查詢,準(zhǔn)備后面針對(duì)特定sql再進(jìn)一步優(yōu)化。下面主要介紹一下一些優(yōu)化的參數(shù)。
概述
最近在對(duì)各個(gè)系統(tǒng)的mysql做一些參數(shù)上的優(yōu)化,也開(kāi)了慢查詢,準(zhǔn)備后面針對(duì)特定sql再進(jìn)一步優(yōu)化。下面主要介紹一下一些優(yōu)化的參數(shù)。
1、優(yōu)化前mysql配置
可以看到基本上是沒(méi)怎么做優(yōu)化的。

2、優(yōu)化后的配置
以下是優(yōu)化后的一些參數(shù)。


3、優(yōu)化參數(shù)說(shuō)明:
- #基礎(chǔ)配置
- datadir=/data/datafile
- socket=/var/lib/mysql/mysql.sock
- log-error=/data/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- character_set_server=utf8
- #允許任意IP訪問(wèn)
- bind-address = 0.0.0.0
- #是否支持符號(hào)鏈接,即數(shù)據(jù)庫(kù)或表可以存儲(chǔ)在my.cnf中指定datadir之外的分區(qū)或目錄,為0不開(kāi)啟
- #symbolic-links=0
- #支持大小寫(xiě)
- lower_case_table_names=1
- #二進(jìn)制配置
- server-id = 1
- log-bin = /data/log/mysql-bin.log
- log-bin-index =/data/log/binlog.index
- log_bin_trust_function_creators=1
- expire_logs_days=7
- #sql_mode定義了mysql應(yīng)該支持的sql語(yǔ)法,數(shù)據(jù)校驗(yàn)等
- #mysql5.0以上版本支持三種sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。
- #ANSI模式:寬松模式,對(duì)插入數(shù)據(jù)進(jìn)行校驗(yàn),如果不符合定義類型或長(zhǎng)度,對(duì)數(shù)據(jù)類型調(diào)整或截?cái)啾4妫瑘?bào)warning警告。
- #TRADITIONAL模式:嚴(yán)格模式,當(dāng)向mysql數(shù)據(jù)庫(kù)插入數(shù)據(jù)時(shí),進(jìn)行數(shù)據(jù)的嚴(yán)格校驗(yàn),保證錯(cuò)誤數(shù)據(jù)不能插入,報(bào)error錯(cuò)誤。用于事物時(shí),會(huì)進(jìn)行事物的回滾。
- #STRICT_TRANS_TABLES模式:嚴(yán)格模式,進(jìn)行數(shù)據(jù)的嚴(yán)格校驗(yàn),錯(cuò)誤數(shù)據(jù)不能插入,報(bào)error錯(cuò)誤。
- sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
- #InnoDB存儲(chǔ)數(shù)據(jù)字典、內(nèi)部數(shù)據(jù)結(jié)構(gòu)的緩沖池,16MB已經(jīng)足夠大了。
- innodb_additional_mem_pool_size = 16M
- #InnoDB用于緩存數(shù)據(jù)、索引、鎖、插入緩沖、數(shù)據(jù)字典等
- #如果是專用的DB服務(wù)器,且以InnoDB引擎為主的場(chǎng)景,通常可設(shè)置物理內(nèi)存的60%
- #如果是非專用DB服務(wù)器,可以先嘗試設(shè)置成內(nèi)存的1/4
- innodb_buffer_pool_size = 4G
- #InnoDB的log buffer,通常設(shè)置為 64MB 就足夠了
- innodb_log_buffer_size = 64M
- #InnoDB redo log大小,通常設(shè)置256MB 就足夠了
- innodb_log_file_size = 256M
- #InnoDB redo log文件組,通常設(shè)置為 2 就足夠了
- innodb_log_files_in_group = 2
- #共享表空間:某一個(gè)數(shù)據(jù)庫(kù)的所有的表數(shù)據(jù),索引文件全部放在一個(gè)文件中,默認(rèn)這個(gè)共享表空間的文件路徑在data目錄下。 默認(rèn)的文件名為:ibdata1 初始化為10M。
- #獨(dú)占表空間:每一個(gè)表都將會(huì)生成以獨(dú)立的文件方式來(lái)進(jìn)行存儲(chǔ),每一個(gè)表都有一個(gè).frm表描述文件,還有一個(gè).ibd文件。 其中這個(gè)文件包括了單獨(dú)一個(gè)表的數(shù)據(jù)內(nèi)容以及索引內(nèi)容,默認(rèn)情況下它的存儲(chǔ)位置也是在表的位置之中。
- #設(shè)置參數(shù)為1啟用InnoDB的獨(dú)立表空間模式,便于管理
- innodb_file_per_table = 1
- #InnoDB共享表空間初始化大小,默認(rèn)是 10MB,改成 1GB,并且自動(dòng)擴(kuò)展
- innodb_data_file_path = ibdata1:1G:autoextend
- #設(shè)置臨時(shí)表空間最大4G
- innodb_temp_data_file_path=ibtmp1:500M:autoextend:max:4096M
- #啟用InnoDB的status file,便于管理員查看以及監(jiān)控
- innodb_status_file = 1
- #當(dāng)設(shè)置為0,該模式速度最快,但不太安全,mysqld進(jìn)程的崩潰會(huì)導(dǎo)致上一秒鐘所有事務(wù)數(shù)據(jù)的丟失。
- #當(dāng)設(shè)置為1,該模式是最安全的,但也是最慢的一種方式。在mysqld 服務(wù)崩潰或者服務(wù)器主機(jī)crash的情況下,binary log 只有可能丟失最多一個(gè)語(yǔ)句或者一個(gè)事務(wù)。
- #當(dāng)設(shè)置為2,該模式速度較快,也比0安全,只有在操作系統(tǒng)崩潰或者系統(tǒng)斷電的情況下,上一秒鐘所有事務(wù)數(shù)據(jù)才可能丟失。
- innodb_flush_log_at_trx_commit = 1
- #設(shè)置事務(wù)隔離級(jí)別為 READ-COMMITED,提高事務(wù)效率,通常都滿足事務(wù)一致性要求
- #transaction_isolation = READ-COMMITTED
- #max_connections:針對(duì)所有的賬號(hào)所有的客戶端并行連接到MYSQL服務(wù)的最大并行連接數(shù)。簡(jiǎn)單說(shuō)是指MYSQL服務(wù)能夠同時(shí)接受的最大并行連接數(shù)。
- #max_user_connections : 針對(duì)某一個(gè)賬號(hào)的所有客戶端并行連接到MYSQL服務(wù)的最大并行連接數(shù)。簡(jiǎn)單說(shuō)是指同一個(gè)賬號(hào)能夠同時(shí)連接到mysql服務(wù)的最大連接數(shù)。設(shè)置為0表示不限制。
- #max_connect_errors:針對(duì)某一個(gè)IP主機(jī)連接中斷與mysql服務(wù)連接的次數(shù),如果超過(guò)這個(gè)值,這個(gè)IP主機(jī)將會(huì)阻止從這個(gè)IP主機(jī)發(fā)送出去的連接請(qǐng)求。遇到這種情況,需執(zhí)行flush hosts。
- #執(zhí)行flush host或者 mysqladmin flush-hosts,其目的是為了清空host cache里的信息。可適當(dāng)加大,防止頻繁連接錯(cuò)誤后,前端host被mysql拒絕掉
- #在 show global 里有個(gè)系統(tǒng)狀態(tài)Max_used_connections,它是指從這次mysql服務(wù)啟動(dòng)到現(xiàn)在,同一時(shí)刻并行連接數(shù)的最大值。它不是指當(dāng)前的連接情況,而是一個(gè)比較值。如果在過(guò)去某一個(gè)時(shí)刻,MYSQL服務(wù)同時(shí)有10
- 00個(gè)請(qǐng)求連接過(guò)來(lái),而之后再也沒(méi)有出現(xiàn)這么大的并發(fā)請(qǐng)求時(shí),則Max_used_connections=1000.請(qǐng)注意與show variables 里的max_user_connections的區(qū)別。#Max_used_connections / max_connections * 100% ≈ 85%
- max_connections=600
- max_connect_errors=1000
- max_user_connections=400
- #設(shè)置臨時(shí)表最大值,這是每次連接都會(huì)分配,不宜設(shè)置過(guò)大 max_heap_table_size 和 tmp_table_size 要設(shè)置一樣大
- max_heap_table_size = 100M
- tmp_table_size = 100M
- #每個(gè)連接都會(huì)分配的一些排序、連接等緩沖,一般設(shè)置為 2MB 就足夠了
- sort_buffer_size = 2M
- join_buffer_size = 2M
- read_buffer_size = 2M
- read_rnd_buffer_size = 2M
- #建議關(guān)閉query cache,有些時(shí)候?qū)π阅芊炊且环N損害
- query_cache_size = 0
- #如果是以InnoDB引擎為主的DB,專用于MyISAM引擎的 key_buffer_size 可以設(shè)置較小,8MB 已足夠
- #如果是以MyISAM引擎為主,可設(shè)置較大,但不能超過(guò)4G
- key_buffer_size = 8M
- #設(shè)置連接超時(shí)閥值,如果前端程序采用短連接,建議縮短這2個(gè)值,如果前端程序采用長(zhǎng)連接,可直接注釋掉這兩個(gè)選項(xiàng),是用默認(rèn)配置(8小時(shí))
- #interactive_timeout = 120
- #wait_timeout = 120
- #InnoDB使用后臺(tái)線程處理數(shù)據(jù)頁(yè)上讀寫(xiě)I/0請(qǐng)求的數(shù)量,允許值的范圍是1-64
- #假設(shè)CPU是2顆4核的,且數(shù)據(jù)庫(kù)讀操作比寫(xiě)操作多,可設(shè)置
- #innodb_read_io_threads=5
- #innodb_write_io_threads=3
- #通過(guò)show engine innodb status的FILE I/O選項(xiàng)可查看到線程分配
- #設(shè)置慢查詢閥值,單位為秒
- long_query_time = 120
- slow_query_log=1 #開(kāi)啟mysql慢sql的日志
- log_output=table,File #日志輸出會(huì)寫(xiě)表,也會(huì)寫(xiě)日志文件,為了便于程序去統(tǒng)計(jì),所以最好寫(xiě)表
- slow_query_log_file=/data/log/slow.log
- ##針對(duì)log_queries_not_using_indexes開(kāi)啟后,記錄慢sql的頻次、每分鐘記錄的條數(shù)
- #log_throttle_queries_not_using_indexes = 5
- ##作為從庫(kù)時(shí)生效,從庫(kù)復(fù)制中如何有慢sql也將被記錄
- #log_slow_slave_statements = 1
- ##檢查未使用到索引的sql
- #log_queries_not_using_indexes = 1
- #快速預(yù)熱緩沖池
- innodb_buffer_pool_dump_at_shutdown=1
- innodb_buffer_pool_load_at_startup=1
- #打印deadlock日志
- innodb_print_all_deadlocks=1
責(zé)任編輯:張燕妮
來(lái)源:
今日頭條