1. 程式人生 > >mysql的優化配置檔案及註釋

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 工具備份資料庫時,當某張表過大時備份會報錯,需要增大該值( 增大到大於表大小的值 )