超詳細的MySQL數據庫參數優化,都總結在這里了
作者:波波說運維
最近在對各個系統的mysql做一些參數上的優化,也開了慢查詢,準備后面針對特定sql再進一步優化。下面主要介紹一下一些優化的參數。
概述
最近在對各個系統的mysql做一些參數上的優化,也開了慢查詢,準備后面針對特定sql再進一步優化。下面主要介紹一下一些優化的參數。
1、優化前mysql配置
可以看到基本上是沒怎么做優化的。

2、優化后的配置
以下是優化后的一些參數。


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