概述
最近在對各個系統的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