mysql的優化配置檔案及註釋
簡介:
Mysql 引數優化
一、Mysql 原始碼編譯引數
shell > yum -y install gcc gcc-c++ make cmake ncurses-devel zlib-devel bison shell > cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DTMPDIR=/usr/local/mysql/data \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock \ -DSYSCONFDIR=/etc/my.cnf \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DDEFAULT_CHARSET=utf8 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_COLLATION=utf8_general_ci
## -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 指定 Mysql 安裝路徑
## -DMYSQL_DATADIR=/usr/local/mysql/data 指定 Mysql 資料目錄
## -DTMPDIR=/usr/local/mysql/data 指定 Mysql 臨時目錄
## -DMYSQL_UNIX_ADDR 指定 Mysql socket
## -DSYSCONFDIR=/etc/my.cnf 指定 Mysql 配置檔案
## -DWITH_MYISAM_STORAGE_ENGINE=1 安裝 MyISAM 儲存引擎
## -DWITH_INNOBASE_STORAGE_ENGINE=1 安裝 Innodb 儲存引擎
## -DWITH_FEDERATED_STORAGE_ENGINE=1 安裝 Federated 儲存引擎
## -DDEFAULT_CHARSET=utf8 指定預設字符集為 utf8
## -DEXTRA_CHARSETS=all 安裝擴充套件字符集
## -DDEFAULT_COLLATION=utf8_general_ci 預設排序規則 utf8_general_ci
---------------------------------------------------------------------------------------------
二、my.cnf 配置檔案
## global_buffers 在記憶體中快取從資料檔案中檢索出來的資料塊,可以大大提高查詢和更新資料的效能 ## 計算公式:Innodb_buffer_pool_size + Innodb_additional_mem_pool_size + Innodb_log_buffer_size + key_buffer_size + query_cache_size ## per_thread_buffers 執行緒獨享記憶體大小 ## 計算公式( read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size + binlog_cache_size )* max_connections ## 注意:global_buffers + per_thread_buffers 不能大於實際實體記憶體,否者併發量大時會造成記憶體溢位、系統宕機 ! [client] port = 3306 socket = /usr/local/mysql/data/mysql.sock ## 定義客戶端連線資訊,埠號、socket 存放位置 [mysqld] port = 3306 socket = /usr/local/mysql/data/mysql.sock basedir = /usr/local/mysql datadir = /usr/local/mysql/data temdir = /usr/local/mysql/data ## Mysql 基本資訊,埠號、socket、安裝目錄、資料存放目錄、臨時目錄 # skip-name-resolve ## 禁止 Mysql 對外部連線進行 DNS 解析,加快連線速度。開啟後所有遠端連線主機只能使用 IP 的方式 skip_external_locking ## 避免 Mysql 外部鎖定,減少出錯機率、增強穩定性 local-infile = 0 ## 禁止 SQL 讀取本地檔案 character-set-server = utf8 ## 預設字符集 utf8 default-storage-engine = innodb ## 預設儲存引擎 # general_log = on ## 開啟查詢日誌,一般選擇不開啟,因為查詢日誌記錄很詳細,會增大磁碟 IO 開銷,影響效能 # general_log_file = /usr/local/mysql/data/mysql.log ## 查詢日誌存放位置及檔名 log-error = /usr/local/mysql/data/error.log ## 錯誤日誌位置跟檔名 # slow_query_log = on ## 開啟慢查詢日誌,開啟後將會記錄執行時間超過 long_query_time 引數值的 SQL 語句( 一般臨時開啟即可 ) # long_query_time = 2 ## 定義執行時間超過多少秒為慢查詢,預設 10s # slow_query_log_file = /usr/local/mysql/data/slow.log ## 定義慢查詢日誌存放位置 # server-id = 1 ## Mysql Server 唯一標識,用來做主同同步( 主從時開啟 ) log-bin = mysql-bin ## 開啟 binlog ( 二進位制 ) 日誌,主要用來做增量備份跟主從同步 binlog_format = mixed ## Mysql binlog 的日誌格式,Statement、ROW 跟 Mixed( 混合模式 ) binlog_cache_size = 2M ## 二進位制日誌緩衝大小,此引數是為每 Session 單獨分配的,當一個執行緒開始一個事務時,Mysql 就會為此 Session 分配一個 binlog cache,當這個事務提交時,binlog cache 中的資料被寫入 binlog 檔案 ## 通過 show status like 'binlog_cache%'; 來檢視使用 binlog cache 的次數及使用磁碟的次數 sync_binlog = 0 ## 這個引數對 Mysql 系統來說很重要,不僅影響到 binlog 對 Mysql 所帶來的效能損耗,還影響到 Mysql 中資料的完整性。 ## 值為 0 時代表事務提交後,Mysql 不做 fsync 之類的磁碟同步指令重新整理 binlog_cache 中的資訊到磁碟,而讓 Filesystem 自行決定什麼時候同步,或者 cache 滿了之後才同步磁碟。 ## 值為 n 時代表進行 n 次事務提交後,Mysql 將進行一次 fsync 之類的磁碟同步指令來將 binlog_cache 中的資料強制寫入磁碟。 ## 系統預設將此引數設定為 0 ,即不做任何強制性的磁碟重新整理指令,效能最好,但是風險也最大。當系統崩潰時 binlog_cache 中的所有 binlog 資訊都會丟失。 ## 而設定為 1 時,是最安全但是效能損耗最大。當系統崩潰時,最多丟失 binlog_cache 中未完成的一個事務,對實際資料沒有實質性的影響。 expire_logs_days = 30 ## 保留 30 天的 binlog 日誌,系統重啟、執行 flush logs 或 binlog 日誌檔案大小達到上限時刪除 binlog 日誌 back_log = 500 ## Mysql 連線請求佇列存放數,當某一時刻客戶端連線請求過多,造成 Mysql Server 無法為其建立連線時存放的數量,最大 65535( 增大時需同時調整 OS 級別的網路監聽佇列限制 ) max_connections = 1000 ## Mysql 最大連線數,直接影響 Mysql 應用的併發處理能力( 500~1000 是個比較合適的值,注意每建立的連線都會佔用一定的記憶體空間,直到連線被關閉才釋放記憶體 ) wait_timeout = 100 interactive_timeout = 100 ## 伺服器關閉非交換連線之前等待活動的秒數,預設 28800 秒( 注意:在 my.cnf 中修改這個引數需要配合 interactive_timeout (超時間隔)引數一起修改,否則不生效) ##( Mysql 處理完一條連線後所等待釋放的時間,如果併發很高,預設設定會導致最大連線被佔滿,出現 "too many connections" 錯誤 ) ##( 如果這個值很低,比如 5 ,可能會導致出現 "ERROR 2006 (HY000) MySQL server has gone away" 的錯誤,出現這個錯誤還有可能是 max_allowed_packet 設定過小 ) ## 真實案例 max_connect_errors = 1000 ## 最大連線失敗次數,跟效能沒有太大關係,主要跟安全方面有關( 達到此上限後會無條件阻止其連線資料庫 ,預設 100 ) connect_timeout = 20 ## 連線超時時間為 20 秒 max_allowed_packet = 16M ## 網路傳輸中一次訊息量的最大值,預設 4M ,必須設為 1024 的整倍數 table_open_cache = 2000 ## 開啟檔案描述符的快取個數,防止系統頻繁開啟、關閉描述符而浪費資源( 對效能有影響,預設 2000 ) read_buffer_size = 512K ## Mysql 讀入緩衝區大小,對錶進行順序掃描的請求將分配一個讀入緩衝區,Mysql 會為其分配一段記憶體緩衝區( 預設 128K ,此引數為每執行緒分配 ) read_rnd_buffer_size = 512K ## Mysql 隨機 Query 緩衝區大小,當按任意順序讀取行時,將分配一個隨機讀取緩衝區。如進行排序查詢時,Mysql 會首先掃描該緩衝,避免磁碟搜尋,提高查詢速度( 預設 256K ,該緩衝也是為每執行緒分配 ) sort_buffer_size = 512K ## 系統中對資料進行排序時使用的 buffer ,如果系統中排序比較大,且記憶體充足、併發不大時,可以適當增大此值( 預設 256K ,此引數為每執行緒分配獨立的 buffer ) join_buffer_size = 512K ## join 為 ALL、index、rang 或 index_merge 時使用的 buffer( 預設 256K ,每 Thread 都會建立自己獨立的 buffer ) thread_stack = 256K ## 引數表示每執行緒的堆疊大小 thread_cache_size = 64 ## Thread Cache 池中存放的連線執行緒數( 此池中的執行緒不是啟動服務時就建立的,而是隨著連線執行緒的建立和使用,逐漸將用完的執行緒存入其中,達到此值後將不再快取連線執行緒 ) ## 快取命中率計算公式:Thread_Cache_Hit = ( Connections - Thread_created ) / Connections * 100% ## 系統執行一段時間後,Thread Cache 命中率應該保持在 90% 以上 explicit_defaults_for_timestamp = 1 ## 如果此引數不開啟,error_log 中會有警告資訊 query_cache_type = 1 ## 是否啟用 query_cache ,0 為不使用( 若要關閉 query_cache 時,需同時將 query_cache_size 、query_cache_limit 設為 0 ) query_cache_size = 32M ## 查詢緩衝大小,當重複查詢時會直接從該緩衝中獲取,但是當所查詢表有改變時,緩衝的查詢將失效( 頻繁寫入、更新、高併發的環境下建議關閉此緩衝 ) query_cache_limit = 1M ## 單個查詢所能夠使用的緩衝區大小 ft_min_word_len = 1 ## 使用全文索引最小長度 transaction_isolation = REPEATABLE-READ ## 事務隔離級別,為了有效保證併發讀取資料的正確性( 預設 Repeatables Read 即:可重複讀 ) ## Innodb 有四種隔離級別:Read Uncommitted( 未提交讀 )、Read Committed( 已提交讀 )、Repeatable Read( 可重複讀 )、Serializable( 可序列化 ) tmp_table_size = 32M ## 臨時表大小 key_buffer_size = 32M ## 用來快取 MyISAM 儲存引擎的索引( 預設 8M ,如果使用 Innodb 儲存引擎,此值設為 64M 或更小 ) ## 計算公式:key_reads / key_read_requests * 100% 的值小於 0.1% ## Innodb 儲存引擎相關引數 innodb_file_per_table = 0 ## 關閉獨享表空間,使用共享表空間 innodb_buffer_pool_size = 256M ## Innodb 儲存引擎核心引數,用於快取 Innodb 表的索引、資料( 預設 128M ,單獨使用 Innodb 儲存引擎且單一 Mysql 服務時建議設為實體記憶體的 70% - 80 % ) ## 可以通過 show status like 'innodb_buffer_pool_%'; 來獲取 innodb buffer pool 的實時狀態資訊 ## Innodb_buffer_pool_pages_total 總共的 pages( Innodb 儲存引擎中所有資料存放最小物理單位 page ,每個 page 預設為 16KB ) ## Innodb_buffer_pool_pages_free 空閒的 pages ## Innodb_buffer_pool_pages_data 有資料的 pages ## Innodb_buffer_pool_read_requests 總共的 read 請求次數 ## Innodb_buffer_pool_reads 讀取物理磁碟讀取資料的次數,即:在 buffer pool 中沒有找到 ## Innodb_buffer_pool_wait_free 因 buffer 空間不足而產生的 wait_free ## Innodb_buffer_pool_read_ahead_rnd 記錄進行隨機讀的時候產生的預讀次數 ## Innodb_buffer_pool_read_ahead_seq 記錄連續讀的時候產生的預讀次數 ## Innodb_buffer_pool_size 使用率 = innodb_buffer_pool_pages_data / innodb_buffer_pool_pages_total * 100% ## Innodb_buffer_pool_read 命中率 = ( innodb_buffer_pool_read_requests - innodb_buffer_pool_reads )/ innodb_buffer_pool_read_requests * 100% innodb_use_sys_malloc = 1 ## 使用系統自帶的記憶體分配器,替代 innodb_additional_mem_pool_size 引數 innodb_data_file_path = ibdata1:512M:autoextend ## 指定一個大小為 512M 的、可擴充套件的 ibdata1 資料檔案 innodb_read_io_threads = 4 innodb_write_io_threads = 4 ## Innodb 使用後臺執行緒處理資料頁上的 IO 請求,根據 CPU 核數修改,預設 4 innodb_thread_concurrency = 0 ## Innodb 執行緒併發數,0 為不限制,預設 0 innodb_flush_log_at_trx_commit = 2 ## Innodb 事務日誌重新整理方式,0 為每隔一秒 log thread 會將 log buffer 中的資料寫入到檔案,並通知檔案系統進行檔案同步 flush 操作,極端情況下會丟失一秒的資料 ## 1 為每次事務結束都會觸發 log thread 將 log buffer 中的資料寫入檔案並通知檔案系統同步檔案,資料最安全、不會丟失任何已經提交的資料 ## 2 為每次事務結束後 log thread 會將資料寫入事務日誌,但只是呼叫了檔案系統的檔案寫入操作,並沒有同步到物理磁碟,因為檔案系統都是有快取機制的,各檔案系統的快取重新整理機制不同 ## 當設為 1 時是最為安全的,但效能也是最差的。0 為每秒同步一次,效能相對高一些。設為 2 效能是最好的,但故障後丟失資料也最多( OS 跟主機硬體、供電足夠安全可以選擇,或對資料少量丟失可以接受 )。 innodb_log_buffer_size = 8M ## 事務日誌所使用的緩衝區。Innodb 在寫事務日誌時,為了提高寫 Log 的 IO 效能,先將資訊寫入 Innodb Log Buffer 中,當滿足 Innodb_flush_log_trx_commit 引數或日誌緩衝區寫滿時,再將日誌同步到磁碟中。 ## 預設 8M ,一般設為 16~64M 即可,可以通過 show status like 'innodb_log%'; 檢視狀態 innodb_buffer_pool_dump_at_shutdown = 1 ## 關閉資料庫時把熱資料 dump 到本地磁碟。 innodb_buffer_pool_dump_now = 1 ## 採用手工方式把熱資料 dump 到本地磁碟。 innodb_buffer_pool_load_at_startup = 1 ## 啟動時把熱資料載入到記憶體。 innodb_buffer_pool_load_now = 1 ## 採用手工方式把熱資料載入到記憶體。 ## 以上四條引數會快速預熱 Buffer_pool 緩衝池,當機器正常重啟後,熱資料還保留在記憶體中,避免瞬間連線數爆滿導致機器宕機。 [mysqldump] quick max_allowed_packet = 4M ## 使用 mysqldump 工具備份資料庫時,當某張表過大時備份會報錯,需要增大該值( 增大到大於表大小的值 )