程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql 性能優化 ( my.cnf ),mysqlmy.cnf

Mysql 性能優化 ( my.cnf ),mysqlmy.cnf

編輯:MySQL綜合教程

Mysql 性能優化 ( my.cnf ),mysqlmy.cnf



簡介:

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

Cmake 參數:http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html

---------------------------------------------------------------------------------------------

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved