Mysql參數詳解


1、配置參數

MySQL有兩種途徑途徑了解其的配置參數,一個是MySQL交互模式下的命令SHOW  VARIABLES,一個使用mysqladmin variables 查詢。

MySQL的配置參數分為2種,全局的和局部的。局部的配置變量可以在每次會話中自己更改。

從MySQL 4.0以后開始,在SHOW VARIABLES中顯示的參數,大部分可以動態使用SET命令進行更改。

基本參數配置:

參數

說明

bind-address

綁定的IP地址

user

用戶

port

端口號

datadir

數據文件目錄

basedir

msyql應用程序的目錄

socket

socket文件,默認在/tmp目錄下,但是建議不要這樣設置,/tmp目錄是一個大家都願意破壞的目錄

default-table-type

默認表類型

查詢的Cache的是從MySQL4.0版本開始提供的功能。相關的參數為:

參數

說明

query_cache_size

查詢Cache的尺寸

query_cache_type

查詢的Cache類型。

0 OFF,不進行緩沖

1 ON,進行緩沖

2 DEMAND,對SELECT SQL_CACHE開頭的查詢進行緩沖

query_cache_limit

查詢的結果的限制長度,小於這個長度的數據才能Cache

MyISAM的索引參數:key_buffer_size為MyISAM引擎的最關鍵的優化參數之一。

參數

說明

key_buffer_size

(關鍵參數),索引塊用的緩沖區大小,所有的連接程序線程共用

key_cache_block_size

每一個索引block的大小,默認1024字節,從4.1.1后才出現這個參數,原來都是直接采用1024字節作為Block的長度

InnoDB使用的參數:InnoDB的參數較少,籠統而不細致,內存的管理多由InnoDB引擎自己負責,主要的緩沖就是innodb_buffer_pool_size參數分配的緩沖。這樣配置倒是簡單了,但沒有了細致優化樂趣。

參數

說明

innodb_buffer_pool_size

innodb的緩沖區大小,存放數據和索引,一般設置為機器內存的50%-80%

 (關鍵參數)

innodb_log_buffer_size

InnoDB日志緩沖區大小

innodb_flush_method

刷新日志的方法

innodb_additional_mem_pool_size

innodb內存池的大小,存放着各種內部使用的數據結構

innodb_data_home_dir

InnoDB數據文件的目錄

innodb_data_file_path

數據文件配置

innodb_log_files_in_group

Innodb日志的

innodb_log_file_size

Innodb日志文件的尺寸

innodb_lock_wait_timeout

等待數據鎖的超時時間,避免死鎖的一種措施

innodb_flush_log_at_trx_commit

日志提交方式 (關鍵參數)

0每秒寫1次日志,將數據刷入磁盤,相當於每秒提交一次事務。

1每次提交事務寫日志,同時將刷新相應磁盤,默認參數。

2每提交事務寫一次日志,但每隔一秒刷新一次相應的磁盤文件[注]

innodb_force_recovery

在Innodb的自動恢復失敗后,從崩潰中強制啟動,有1-6個級別,數值越低恢復的方式也保守,默認為4。盡量使用較保守方式恢復。

恢復后要注釋刪除這一行。

Log的參數:MySQL的日志有6種,查詢日志,慢查詢日志,變更日志,二進制變更日志,告警日志,錯誤日志。my.cnf中可以配置日志的前綴和日志參數。日志是監控數據庫系統的重要途徑。

參數

說明

log

查詢日志,記錄所有的MySQL的命令操作,在跟蹤數據庫運行時非常有幫助,但在實際環境中就不要使用了

log-update

變更日志,用文本方式記錄所有改變數據的變更操作,

log-bin

二進制變更日志,更加緊湊,使用mysqlbinlog讀取,操作,轉換

binlog_cache_size

臨時存放某次事務的SQL語句緩沖長度

max_binlog_cache_szie

最大的二進制Cache日志緩沖區尺寸

max_binlog_size

最大的二進制日志尺寸

log-error

導致無法啟動的錯誤日志

log-warnings

告警日志

long_query_time

慢查詢時間限度,超過這個限度,mysqld認為是一個慢查詢

log-queries-not-using-indexes

沒有使用索引查詢的日志,方便記錄長時間訪問的查詢進行優化

log-slow-queries

慢速的查詢日志,

打開文件參數:

參數

說明

table_cache

能夠被同時打開的表最大個數,打開一個表使用2個文件描述符

(關鍵參數)

open_files_limit

mysqld保留的文件描述符號個數,和table_cache和max_connections設置相關,默認為0

設置為0, 系統設置max_connections*5或者max_connections + table_cache*2中的最大值

關於連接通信的參數:

參數

說明

max_connections

最大的連接數

max_connect_errors

同一個地址最大錯誤連接數,防止攻擊用

net_buffer_length

服務器和客戶之間通訊的使用的緩沖區長度

max_allowed_packet

服務器和客戶之間最大的通信的緩沖區長度

net_read_timeout

網絡讀取超時

net_write_timeout

網絡寫入超時

interactive_timeout

交互模式下的沒有操作后的超時時間

wait_ timeout

非交互模式的沒有操作后的超時時間

每個會話使用的buffer設置,默認使用my.cnf的配置,也可以使用每個會話設置。不要設置的過大。

參數

說明

read_buffer_size

(record_buffer)

對數據表作順序讀取的緩沖大小

read_rnd_buffer_size

在排序后,讀取結果數據的緩沖區大小,

sort_buffer_size

(sort_buffer)

用來完成排序操作的線程使用的緩沖區大小

join_buffer_size

全關聯操作緩沖區(沒有索引而進行關聯操作)

write_buffer_size

myisamchk的特有選項

寫入緩沖區大小

myisam_sort_buffer_szie

為索引的重新排序操作(比如CREATE INDEX)的分配的緩沖區的長度

對於磁盤緩式寫入的一些選項,delay_key_write,flush,flush_time參數可能可以進一步提高MyISAM引擎的性能,但是在服務器Crash的時候,可能會丟失數據,造成表損壞。

MySQL對於插入語句支持一個選項INSERT DELAYED,如果有這個選項,MySQL將這些插入語句放入一個隊列,並不馬上讀入磁盤。delay_insert_XXX的選項都是配置這個功能,

MySQL創建表的時候也有一個選項,DELAY_KEY_WRITE,有這個選項描述的表的鍵發生改動后,改動可以緩沖在key_buffer中,不立即回寫磁盤。

參數

說明

delay_insert_limit

INSERT DELAYED語句選項。(插入語句的描述)

處理INSERT DELAYED語句,MYSQL插入delay_insert_limit條語句后檢查是否有查詢語句,如有有去查詢,如果沒有,則繼續插入

delay_insert_timeout

在處理完INSERT DELAYED對列的插入數據后,MYSQL等待delay_insert_timeout秒后看看是否有INSERT DELAYED數據,如果有繼續,如果沒有結束這次操作。

delay_query_size

INSERT DELAYED插入數據對列的長度

max_delayed_threads

處理INSERT DELAYED語句的最大線程個數

delay_key_write

對於使用DELAY_KEY_WRITE選項的創建的表,可以延緩鍵讀寫

0N  不延緩所有的鍵寫如操作

OFF延緩有DELAY_KEY_WRITE選項的標的鍵寫入操作

ALL延緩所有的表

flush

是否要在每個操作后立即刷新數據表

flush_time

每隔多少秒,對數據表進行一次刷新。關閉后打開。

 

 

關閉某些選項:關閉某些選項可以加快MySQL的運行速度,這些選項在MySQL SHOW VARIABLES 中顯示為have_XXX 的變量。

參數

說明

skip-openssl

關閉mysql服務器對SSL加密的支持

skip-isam

關閉mysql服務器對isam的引擎的支持

skip-bdb

關閉mysql服務器對bdb的引擎的支持

skip-external-locking

不使用外部鎖,MySQL的外部鎖用於防止其他程序修改正在數據文件,但其在部分系統上不可靠,一般都不使用。(4.03版本前叫skip-locking)

skip-innodb

關閉mysql服務器對innodb的引擎的支持

skip_networking

只能從本地訪問數據庫

 

 

其他參數:

參數

說明

slow_launch_time

用多於這個時間創建的線程視為一個慢創建線程

binlog_cache_size

臨時存放構成每次事務的SQL的緩沖區長度,(全局變量,但是應該影響每一個會話)

max_binlog_cache_size

二進制日志緩沖區的最大長度,其實就是事物的最大長度,默認4G

max_heap_table_size

HEAP表的最大允許長度

max_tmp_tables

臨時tables的最大個數

myisam_recover_options

myisam引擎的自動恢復模式

thread_cache_size

線程緩沖區的所能容納的最大線程個數

tmp_table_size

臨時tables的最大尺寸

 

2        運行狀態監控

MySQL有兩種途徑途徑了解其的運行狀態,一個是MySQL交互模式下的命令SHOW STATUS,一個使用mysqladmin extended-status  。兩種方法異曲同工,通過觀察其運行狀態可以了解我們的參數設置是否合理,是否有要優化的表和數據。

SHOW STATUS顯示了MySQL從運行開始到現在為止狀態,大部分為一些計數器,使用FLUSH STATUS可以重新對各種狀態變量進行計數。

                                                                                                                                                     表19 MySQL的狀態計數器

參數

說明

Aborted_clients

因客戶沒有正確關閉而丟棄的連接數量,沒有正確關閉指沒有調用mysql_close就退出,連接超時,數據傳送中客戶端退出

Aborted_connects

試圖連接MySQL服務器但沒有成功的次數

Connections

試圖連接MySQL服務器的嘗試次數,(包括成功的和沒有成功)

 

 

Com_XXX

執行語句的計數器,比如Com_select變量記錄了select語句的個數

 

 

Created_tmp_disk_tables

使用磁盤創建臨時表的次數,如果要創建的臨時表的尺寸大於tmp_table_size,那么臨時表將創建在磁盤上,

Created_tmp_tables

創建臨時表的次數

 

 

Delayed_XXX

INSERT DELAYED語句的執行性能參數

 

 

Opened_tables

曾經打開過的數據表總數

Open_tables

當前處於打開的表個數

Open_files

當前處於打開的文件個數

 

 

Bytes_received

從客戶收到的字節總數

Bytes_send

發送給客戶的字節總數

 

 

Handler_commit

Handler_rollback

事務提交或者回滾的次數

Handler_delete

對數據表刪除一條記錄的次數

Handler_update

對數據表修改一條記錄的次數

Handler_write

對數據表插入一條記錄的次數

Handler_read_first

讀取索引中第一個索引項的個數

Handler_read_key

根據索引直接讀取一行數據的次數,這個數值高表示數據庫有較好的檢索能力。

Handler_read_next

根據索引讀取下個數據行的請求次數. 在一個索引的區間內進行查詢( > < ,orderby 這類查詢條件)會影響這個計數器。

Handler_read_prev

根據索引讀取前個數據行的請求次數.用於一些反序查詢。

Handler_read_rnd

通過一個固定位置(應該就是不通過索引)讀取一個數據行的次數。這個數值很高表示你的很多查詢操作的結果需要排序,可能這些查詢操作不能適當使用索引而要檢索整個表。

Handler_read_rnd_next

請求從數據文件中讀取下一個記錄的次數.如果有很多全表的檢索這個值將很高. 通常這表示數據表沒有合適的索引。

 

 

key_blocks_used

索引緩沖區塊中已經被使用的區塊大小。Block的尺寸默認是1024字節,4.1.1后可以通過key_cache_block_size參數設置。可以根據key_buffer_size/(1024 or key_cache_block_size) 得到Block總數,然后知道key_buffer的利用率

Key_read_requests

從緩沖讀取1個Block的次數

Key_read

從磁盤讀取的次數

Key_write_requests

寫入索引緩沖區寫入一個Block的次數

Key_write

寫回磁盤的次數

 

 

Qcache_free_blocks

Qcache沒有使用的內存塊個數

Qcache_free_memory

Qcache沒有使用的內存尺寸

Qcache_hits

查詢在Qcache中的命中次數,和Com_select比較,就可以知道Qache的大約命中率是多少。

Qcache_inserts

加入Cache中的查詢個數

Qcache_lowmem_prunes

由於Qcache不夠用,造成替換出Qcache的查詢個數

Qcache_not_cached

沒有能Cache的查詢個數

 

 

Slow_queries

慢查詢的次數,如果一個查詢的所用的時間大於long_query_time設置的時間,則計數加1

 

 

Select_XXXX

關聯查詢的一些狀態計數

 

 

Innodb_XXXX

InnoDB的狀態技術器,不過只有MySQL 5.02的版本才支持這些計數器。這兒略過

 

 

Table_locks_waited

必須等待后才能完成表鎖定的請求個數,如果這個數值和下面數值的比率過大,表示數據庫的性能較低

Table_locks_immediate

無需等待,立即完成表鎖定的請求個數。

 

 

Thread_connected

現在處在連接打開狀態的線程個數

Thread_cached

現在在現場緩沖區的線程個數

Thread_created

到目前為止,創建的線程個數

Thead_running

現在運行的線程個數,不是所有打開的線程都在運行,有些會處於SLEEP狀態

InnoDB的狀態監控的要在交互模式下使用show innodb status命令。相對的可以利用InnoDB狀態參數也過少。

 

1、  innodb_flush_log_at_trx_commit  AND  sync_binlog

innodb_flush_log_at_trx_commit = N:

N=0  – 每隔一秒,把事務日志緩存區的數據寫到日志文件中,以及把日志文件的數據刷新到磁盤上;

N=1  – 每個事務提交時候,把事務日志從緩存區寫到日志文件中,並且刷新日志文件的數據到磁盤上;

 

N=2  – 每事務提交的時候,把事務日志數據從緩存區寫到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盤上,而是取決於操作系統的調度;

sync_binlog =  N:

N>0  — 每向二進制日志文件寫入N條SQL或N個事務后,則把二進制日志文件的數據刷新到磁盤上;

N=0  — 不主動刷新二進制日志文件的數據到磁盤上,而是由操作系統決定;

推薦配置組合:

N=1,1  — 適合數據安全性要求非常高,而且磁盤IO寫能力足夠支持業務,比如充值消費系統;

N=1,0  — 適合數據安全性要求高,磁盤IO寫能力支持業務不富余,允許備庫落后或無復制;

N=2,0或2,m(0<m<100)  — 適合數據安全性有要求,允許丟失一點事務日志,復制架構的延遲也能接受;

N=0,0  — 磁盤IO寫能力有限,無復制或允許復制延遲稍微長點能接受,例如:日志性登記業務;

2、 innodb_file_per_table

啟用單表空間,減少共享表空間維護成本,減少空閑磁盤空間釋放的壓力。另外,大數據量情況下 的性能,也會有性能上的提升,為此建議大家使用獨立表空間 代替  共享表空間的方式;

3、  key_buffer_size

 key_buffer_size只能緩存MyISAM或類MyISAM引擎的索引數據,而innodb_buffer_pool_size不僅能緩存索引數據,還能緩存元數據,但是對於我們只使用InnoDB引擎的數據庫系統而言,此參數值也不能設置過於偏小,因為臨時表可能會使用到此鍵緩存區空間,索引緩存區推薦:64M;

4、  query_cache_type  and query_cache_size

n  query_cache_type=N

N=0  —- 禁用查詢緩存的功能;

N=1  —- 啟用產訊緩存的功能,緩存所有符合要求的查詢結果集,除SELECT SQL_NO_CACHE.., 以及不符合查詢緩存設置的結果集外;

N=2  —- 僅僅緩存SELECT SQL_CACHE …子句的查詢結果集,除不符合查詢緩存設置的結果集外;

n  query_cache_size

查詢緩存設置多大才是合理?至少需要從四個維度考慮:

①   查詢緩存區對DDL和DML語句的性能影響;

②   查詢緩存區的內部維護成本;

③   查詢緩存區的命中率及內存使用率等綜合考慮

④   業務類型

 

5、  innodb_commit_concurrency

含義:同一時刻,允許多少個線程同時提交InnoDB事務,默認值為0,范圍0-1000。

0      — 允許任意數量的事務在同一時間點提交;

N>0  — 允許N個事務在同一時間點提交;

注意事項:

①   mysqld提供服務時,不許把 innodb_commit_concurrency 的值從0改為非0,或非0的值改為0;

 

②   mysqld提供時,允許把 innodb_commit_concurrency 的值N>0改為M,且M>0;

6、 innodb_concurrency_tickets

含義:

同一時刻,能訪問InnoDB引擎數據的線程數,默認值為500,范圍1-4294967295。

補充說明:當訪問InnoDB引擎數據的線程數達到設置的上線,線程將會被放到隊列中,等待其他線程釋放ticket。

建議:

    MySQL數據庫服務最大線程連接數參數max_connections,一般情況下都會設置在128-1024的范圍,再結合實際業務可能的最大事務並發度,innodb_concurrency_tickets保持默認值一般情況下足夠。

7、 innodb_fast_shutdown  and innodb_force_recovery

innodb_fast_shutdown:

含義:設置innodb引擎關閉的方式,默認值為:1,正常關閉的狀態;

0         —  mysqld服務關閉前,先進行數據完全的清理和插入緩沖區的合並操作,若是臟數據

較多或者服務器性能等因素,會導致此過程需要數分鍾或者更長時間;

1          — 正常關閉mysqld服務,針對innodb引擎不做任何其他的操作;

2  — 若是mysqld出現崩潰,立即刷事務日志到磁盤上並且冷關閉mysqld服務;沒有提交

的事務將會丟失,但是再啟動mysqld服務的時候會進行事務回滾恢復;

innodb_force_recovery:

含義:

mysqld服務出現崩潰之后,InnoDB引擎進行回滾的模式,默認值為0,可設置的值0~6;

提示:

   只有在需要從錯誤狀態的數據庫進行數據備份時,才建議設置innodb_force_recovery的值大於0。 若是把此參數作為安全選項,也可以把參數的值設置大於0,防止InnoDB引擎的數據變更,設置不同值的作用:

0 — 正常的關閉和啟動,不會做任何強迫恢復操作;

1 — 跳過錯誤頁,讓mysqld服務繼續運行。跳過錯誤索引記錄和存儲頁,嘗試用

SELECT *  INOT OUTFILE ‘../filename’ FROM tablename;方式,完成數據備份;

2 — 阻止InnoDB的主線程運行。清理操作時出現mysqld服務崩潰,則會阻止數據恢復操作;

3 —  恢復的時候,不進行事務回滾;

4 — 阻止INSERT緩沖區的合並操作。不做合並操作,為防止出現mysqld服務崩潰。不計算

表的統計信息

5 — mysqld服務啟動的時候不檢查回滾日志:InnoDB引擎對待每個不確定的事務就像提交

的事務一樣;

6 — 不做事務日志前滾恢復操作;

推薦的參數組合配置:

innodb_fast_shutdown = 1

#若是機房條件較好可設置為0(雙路電源、UPS、RAID卡電池和供電系統穩定性)

innodb_force_recovery =0

#至於出問題的時候,設置為何值,要視出錯的原因和程度,對數據后續做的操作

8、  innodb_additional_mem_pool_size

含義:開辟一片內存用於緩存InnoDB引擎的數據字典信息和內部數據結構(比如:自適應HASH索引結構);

默認值:build-in版本默認值為:1M;Plugin-innodb版本默認值為:8M;

提示:若是mysqld服務上的表對象數量較多,InnoDB引擎數據量很大,且innodb_buffer_pool_size的值設置 較大,則應該適當地調整innodb_additional_mem_pool_size的值。若是出現緩存區的內存不足,則會直接向操作系統申請內存分配,並且會向MySQL的error log文件寫入警告信息;

9、 innodb_buffer_pool_size

含義:開辟一片內存用於緩存InnoDB引擎表的數據和索引;

默認值:歷史默認值為:8M,現在版本默認值為:128M;

參數最大值:受限於CPU的架構,支持32位還是支持64位,另外還受限於操作系統為32位還是64位;

提示:

innodb_buffer_pool_size的值設置合適,會節約訪問表對象中數據的物理IO。官方手冊上建議專用的數據庫服務器,可考慮設置為物理內存總量的80%,但是個人建議要看物理服務器的物理內存總量,以及考慮: 是否只使用InnoDB引擎、mysqld內部管理占用的內存、最大線程連接數和臨時表等因素,官方提供的80%值作為一個參考,舉而個例子方便大家作決定(前提:物理服務器為mysqld服務專用,且只用InnoDB引擎,假設數據量遠大於物理內存):

1).內存配置:24G    則 innodb_buffer_pool_size=18G

1).內存配置:32G    則 innodb_buffer_pool_size=24G

出現下列哪些情況,則可以考慮減小innodb_buffer_pool_size的值:

1).出現物理內存的競爭,可能導致操作系統的分頁;

2).InnoDB預分配額外的內存給緩沖區和結構管理,當分配的總內存量超過innodb_buffer_pool_size值的10%;

3).地址空間要求必須為連續的,在windows系統有一個嚴重問題,DLL需要加載在特定的地址空間;

4).初始化緩沖區的時間消耗,與緩沖區的大小成正比。官方提供的數據 Linux X86 64位系統 初始化 innodb_buffer_pool_size=10G 大概需要6秒鍾;


10、  lower_case_table_names

   Linux或類Unix平台,對文件名稱大小寫敏感,也即對數據庫、表、存儲過程等對象名稱大小寫敏 感,為減少開發人員的開發成本,為此推薦大家設置該參數使對象名稱都自動轉換成小寫;

11、  max_connect_errors

    max_connect_errors默認值為10,也即mysqld線程沒重新啟動過,一台物理服務器只要連接 異常中斷累計超過10次,就再也無法連接上mysqld服務,為此建議大家設置此值至少大於等於10W; 若異常中斷累計超過參數設置的值,有二種解決辦法,執行命令:FLUSH HOSTS;或者重新啟動mysqld服務;

 

12、  interactive_timeout  and wait_timeout

u  interactive_timeout

       處於交互狀態連接的活動被服務器端強制關閉,而等待的時間,單位:秒;

u  wait_timeout

       與服務器端無交互狀態的連接,直到被服務器端強制關閉而等待的時間,此參數只對基於TCP/IP或基於 Socket通信協議建立的連接才有效,單位:秒;

u  推薦設置

     interactive_timeout = 172800

     wait_timeout  = 172800

13、  transaction-isolation  and binlog-format 

u  transaction-isolation

      可供設置的值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、

SERIALIZABLE,默認的值為: REPEATABLE-READ,事務隔離級別設置的不同,對二進制日志登記格

式影響非常大,詳細信息可見文章解讀MySQL事務的隔離級別和日志登記模式選擇技巧

u  binlog-format

       復制的模式,可供設置的值:STATEMENT、ROW、MIXED(注:5.0.*只有命令行式復制),

5.1.*版本默認設置:MIXED;

u  推薦配置

①   只讀為主的業務應用場景

             transaction-isolation =  read-committed

             binlog-format  = mixed            #5.1.*版本,5.0.*只能設置為 statement

①   非只讀為主的業務應用場景

             transaction-isolation = repeatabled-read

             binlog-format  = mixed            #5.1.*版本,5.0.*只能設置為 statement

14、  event_scheduler

事務調度默認是關閉狀態,也推薦源碼編譯的版本可不編譯進來,以及實際生產環境保持默認禁用 狀態,當真正需要用的時候,可以臨時打開,命令:SET GLOBAL event_scheduler=1;

15、  skip_external_locking

外部鎖,也即操作系統所實施的鎖,只對MyISAM引擎有效,且容易造成死鎖發生,為此我們一律禁用;

16、 innodb_adaptive_hash_index

InnoDB引擎會根據數據的訪問頻繁度,把表的數據逐漸緩到內存,若是一張表的數據大量緩存在 內存中,則使用散列索引(注:Hash Index)會更高效。InnoDB內有Hash Index機制,監控數據的訪 問情況,可以自動創建和維護一個Hash Index,以提供訪問效率,減少內存的使用;

17、  innodb_max_dirty_pages_pct

    InnoDB主線程直接更新Innodb_buffer_pool_size中存在的數據,並且不實時刷回磁盤,而是等待 相關的處罰事件發生,則允許緩存空間的數據量不實時刷回磁盤的最大百分比。比例設置較小,有利於 減少mysqld服務出現問題的時候恢復時間,缺點則是需要更多的物理I/O,為此我們必須根據業務特點 和可承受范圍進行一個折中,一般范圍建議設置為5%~90%,像我們SNS游戲行業的寫非常厲害,綜合 各方面因素,設置為20%;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM