天天看點

mysql服務性能優化—my.cnf配置說明詳解(16G記憶體)

2020部落格位址彙總

2019年部落格彙總

MYSQL伺服器my.cnf配置文檔詳解

硬體:記憶體16G

[client]

port = 3306

socket = /data/3306/mysql.sock

[mysql]

no-auto-rehash

[mysqld]

user = mysql

port = 3306

socket = /data/3306/mysql.sock

basedir = /usr/local/mysql

datadir = /data/3306/data

open_files_limit    = 10240

back_log = 600   

#在MYSQL暫時停止響應新請求之前,短時間内的多少個請求可以被存在堆棧中。如果系統在短時間内有很多連接配接,則需要增大該參數的值,該參數值指定到來的TCP/IP連接配接的監聽隊列的大小。預設值50。

max_connections = 3000   

#MySQL允許最大的程序連接配接數,如果經常出現Too Many Connections的錯誤提示,則需要增大此值。

max_connect_errors = 6000   

#設定每個主機的連接配接請求異常中斷的最大次數,當超過該次數,MYSQL伺服器将禁止host的連接配接請求,直到mysql伺服器重新開機或通過flush hosts指令清空此host的相關資訊。

table_cache = 614  

#訓示表調整緩沖區大小。# table_cache 參數設定表高速緩存的數目。每個連接配接進來,都會至少打開一個表緩存。#是以, table_cache 的大小應與 max_connections 的設定有關。例如,對于 200 個#并行運作的連接配接,應該讓表的緩存至少有 200 × N ,這裡 N 是應用可以執行的查詢#的一個聯接中表的最大數量。此外,還需要為臨時表和檔案保留一些額外的檔案描述符。

# 當 Mysql 通路一個表時,如果該表在緩存中已經被打開,則可以直接通路緩存;如果#還沒有被緩存,但是在 Mysql 表緩沖區中還有空間,那麼這個表就被打開并放入表緩#沖區;如果表緩存滿了,則會按照一定的規則将目前未用的表釋放,或者臨時擴大表緩存來存放,使用表緩存的好處是可以更快速地通路表中的内容。執行 flush tables 會#清空緩存的内容。一般來說,可以通過檢視資料庫運作峰值時間的狀态值 Open_tables #和 Opened_tables ,判斷是否需要增加 table_cache 的值(其中 open_tables 是當#前打開的表的數量, Opened_tables 則是已經打開的表的數量)。即如果open_tables接近table_cache的時候,并且Opened_tables這個值在逐漸增加,那就要考慮增加這個#值的大小了。還有就是Table_locks_waited比較高的時候,也需要增加table_cache。

external-locking = FALSE  

#使用–skip-external-locking MySQL選項以避免外部鎖定。該選項預設開啟

max_allowed_packet = 32M  

#設定在網絡傳輸中一次消息傳輸量的最大值。系統預設值 為1MB,最大值是1GB,必須設定1024的倍數。

sort_buffer_size = 2M  

# Sort_Buffer_Size 是一個connection級參數,在每個connection(session)第一次需要使用這個buffer的時候,一次性配置設定設定的記憶體。

#Sort_Buffer_Size 并不是越大越好,由于是connection級的參數,過大的設定+高并發可能會耗盡系統記憶體資源。例如:500個連接配接将會消耗 500*sort_buffer_size(8M)=4G記憶體

#Sort_Buffer_Size 超過2KB的時候,就會使用mmap() 而不是 malloc() 來進行記憶體配置設定,導緻效率降低。

#技術導讀 http://blog.webshuo.com/2011/02/16/mysql-sort_buffer_size/

#dev-doc: http://dev.mysql.com/doc/refman/5.5/en/server-parameters.html

#explain select*from table where order limit;出現filesort

#屬重點優化參數

join_buffer_size = 2M   

#用于表間關聯緩存的大小,和sort_buffer_size一樣,該參數對應的配置設定記憶體也是每個連接配接獨享。

thread_cache_size = 300   

# 伺服器線程緩存這個值表示可以重新利用儲存在緩存中線程的數量,當斷開連接配接時如果緩存中還有空間,那麼用戶端的線程将被放到緩存中,如果線程重新被請求,那麼請求将從緩存中讀取,如果緩存中是空的或者是新的請求,那麼這個線程将被重新建立,如果有很多新的線程,增加這個值可以改善系統性能.通過比較 Connections 和 Threads_created 狀态的變量,可以看到這個變量的作用。設定規則如下:1GB 記憶體配置為8,2GB配置為16,3GB配置為32,4GB或更高記憶體,可配置更大。

thread_concurrency = 8   

# 設定thread_concurrency的值的正确與否, 對mysql的性能影響很大, 在多個cpu(或多核)的情況下,錯誤設定了thread_concurrency的值, 會導緻mysql不能充分利用多cpu(或多核), 出現同一時刻隻能一個cpu(或核)在工作的情況。thread_concurrency應設為CPU核數的2倍. 比如有一個雙核的CPU, 那麼thread_concurrency的應該為4; 2個雙核的cpu, thread_concurrency的值應為8

#屬重點優化參數

query_cache_size = 64M   

## 對于使用MySQL的使用者,對于這個變量大家一定不會陌生。前幾年的MyISAM引擎優化中,這個參數也是一個重要的優化參數。但随着發展,這個參數也爆露出來一些問題。機器的記憶體越來越大,人們也都習慣性的把以前有用的參數配置設定的值越來越大。這個參數加大後也引發了一系列問題。我們首先分析一下 query_cache_size的工作原理:一個SELECT查詢在DB中工作後,DB會把該語句緩存下來,當同樣的一個SQL再次來到DB裡調用時,DB在該表沒發生變化的情況下把結果從緩存中傳回給Client。這裡有一個關建點,就是DB在利用Query_cache工作時,要求該語句涉及的表在這段時間内沒有發生變更。那如果該表在發生變更時,Query_cache裡的資料又怎麼處理呢?首先要把Query_cache和該表相關的語句全部置為失效,然後在寫入更新。那麼如果Query_cache非常大,該表的查詢結構又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎麼這麼慢了。是以在資料庫寫入量或是更新量也比較大的系統,該參數不适合配置設定過大。而且在高并發,寫入量大的系統,建議把該功能禁掉。

#重點優化參數(主庫 增删改-MyISAM)

query_cache_limit = 4M    

#指定單個查詢能夠使用的緩沖區大小,預設為1M

query_cache_min_res_unit = 2k    

#預設是4KB,設定值大對大資料查詢有好處,但如果你的查詢都是小資料查詢,就容易造成記憶體碎片和浪費

#查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

#如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小資料量的話。

#查詢緩存使用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

#查詢緩存使用率在25%以下的話說明query_cache_size設定的過大,可适當減小;查詢緩存使用率在80%以上而且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多。

#查詢緩存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

default-storage-engine = MyISAM

#default_table_type = InnoDB

thread_stack = 192K  

#設定MYSQL每個線程的堆棧大小,預設值足夠大,可滿足普通操作。可設定範圍為128K至4GB,預設為192KB。

transaction_isolation = READ-COMMITTED   

# 設定預設的事務隔離級别.可用的級别如下:

# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE

# 1.READ UNCOMMITTED-讀未送出2.READ COMMITTE-讀已送出3.REPEATABLE READ -可重複讀4.SERIALIZABLE -串行

tmp_table_size = 256M   

# tmp_table_size 的預設大小是 32M。如果一張臨時表超出該大小,MySQL産生一個 The table tbl_name is full 形式的錯誤,如果你做很多進階 GROUP BY 查詢,增加 tmp_table_size 值。如果超過該值,則會将臨時表寫入磁盤。

max_heap_table_size = 256M

long_query_time = 2

log_long_format

log-slow-queries=/data/3306/slow-log.log

#log-bin = /data/3306/mysql-bin

log-bin

binlog_cache_size = 4M

max_binlog_cache_size = 8M

max_binlog_size = 512M

expire_logs_days = 7

key_buffer_size = 2048M 

#批定用于索引的緩沖區大小,增加它可以得到更好的索引處理性能,對于記憶體在4GB左右的伺服器來說,該參數可設定為256MB或384MB。

read_buffer_size = 1M  

# MySql讀入緩沖區大小。對表進行順序掃描的請求将配置設定一個讀入緩沖區,MySql會為它配置設定一段記憶體緩沖區。read_buffer_size變量控制這一緩沖區的大小。如果對表的順序掃描請求非常頻繁,并且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及記憶體緩沖區大小提高其性能。和sort_buffer_size一樣,該參數對應的配置設定記憶體也是每個連接配接獨享。

read_rnd_buffer_size = 16M   

# MySql的随機讀(查詢操作)緩沖區大小。當按任意順序讀取行時(例如,按照排序順序),将配置設定一個随機讀緩存區。進行排序查詢時,MySql會首先掃描一遍該緩沖,以避免磁盤搜尋,提高查詢速度,如果需要排序大量資料,可适當調高該值。但MySql會為每個客戶連接配接發放該緩沖空間,是以應盡量适當設定該值,以避免記憶體開銷過大。

bulk_insert_buffer_size = 64M   

#批量插入資料緩存大小,可以有效提高插入效率,預設為8M

myisam_sort_buffer_size = 128M   

# MyISAM表發生變化時重新排序所需的緩沖

myisam_max_sort_file_size = 10G   

# MySQL重建索引時所允許的最大臨時檔案的大小 (當 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).

# 如果檔案大小比此值更大,索引會通過鍵值緩沖建立(更慢)

myisam_max_extra_sort_file_size = 10G

myisam_repair_threads = 1   

# 如果一個表擁有超過一個索引, MyISAM 可以通過并行排序使用超過一個線程去修複他們.

# 這對于擁有多個CPU以及大量記憶體情況的使用者,是一個很好的選擇.

myisam_recover   

#自動檢查和修複沒有适當關閉的 MyISAM 表

skip-name-resolve

lower_case_table_names = 1

server-id = 1

innodb_additional_mem_pool_size = 16M   

#這個參數用來設定 InnoDB 存儲的資料目錄資訊和其它内部資料結構的記憶體池大小,類似于Oracle的library cache。這不是一個強制參數,可以被突破。

innodb_buffer_pool_size = 2048M   

# 這對Innodb表來說非常重要。Innodb相比MyISAM表對緩沖更為敏感。MyISAM可以在預設的 key_buffer_size 設定下運作的可以,然而Innodb在預設的 innodb_buffer_pool_size 設定下卻跟蝸牛似的。由于Innodb把資料和索引都緩存起來,無需留給作業系統太多的記憶體,是以如果隻需要用Innodb的話則可以設定它高達 70-80% 的可用記憶體。一些應用于 key_buffer 的規則有 — 如果你的資料量不大,并且不會暴增,那麼無需把 innodb_buffer_pool_size 設定的太大了

innodb_data_file_path = ibdata1:1024M:autoextend   

#表空間檔案 重要資料

innodb_file_io_threads = 4   

#檔案IO的線程數,一般為 4,但是在 Windows 下,可以設定得較大。

innodb_thread_concurrency = 8   

#伺服器有幾個CPU就設定為幾,建議用預設設定,一般為8.

innodb_flush_log_at_trx_commit = 2   

# 如果将此參數設定為1,将在每次送出事務後将日志寫入磁盤。為提供性能,可以設定為0或2,但要承擔在發生故障時丢失資料的風險。設定為0表示事務日志寫入日志檔案,而日志檔案每秒重新整理到磁盤一次。設定為2表示事務日志将在送出時寫入日志,但日志檔案每次重新整理到磁盤一次。

innodb_log_buffer_size = 16M  

#此參數确定些日志檔案所用的記憶體大小,以M為機關。緩沖區更大能提高性能,但意外的故障将會丢失資料.MySQL開發人員建議設定為1-8M之間

innodb_log_file_size = 128M   

#此參數确定資料日志檔案的大小,以M為機關,更大的設定可以提高性能,但也會增加恢複故障資料庫所需的時間

innodb_log_files_in_group = 3   

#為提高性能,MySQL可以以循環方式将日志檔案寫到多個檔案。推薦設定為3M

innodb_max_dirty_pages_pct = 90   

#推薦閱讀 http://www.taobaodba.com/html/221_innodb_max_dirty_pages_pct_checkpoint.html

# Buffer_Pool中Dirty_Page所占的數量,直接影響InnoDB的關閉時間。參數innodb_max_dirty_pages_pct 可以直接控制了Dirty_Page在Buffer_Pool中所占的比率,而且幸運的是innodb_max_dirty_pages_pct是可以動态改變的。是以,在關閉InnoDB之前先将innodb_max_dirty_pages_pct調小,強制資料塊Flush一段時間,則能夠大大縮短 MySQL關閉的時間。

innodb_lock_wait_timeout = 120   

# InnoDB 有其内置的死鎖檢測機制,能導緻未完成的事務復原。但是,如果結合InnoDB使用MyISAM的lock tables 語句或第三方事務引擎,則InnoDB無法識别死鎖。為消除這種可能性,可以将innodb_lock_wait_timeout設定為一個整數值,訓示 MySQL在允許其他事務修改那些最終受事務復原的資料之前要等待多長時間(秒數)

innodb_file_per_table = 0   

#獨享表空間(關閉)

[mysqldump]

quick

max_allowed_packet = 32M

[mysqld_safe]

log-error=/data/3306/mysql_oldboy.err

pid-file=/data/3306/mysqld.pid

#補充

#wait_timeout = 10   

#指定一個請求的最大連接配接時間,對于4GB左右的記憶體伺服器來說,可以将其設定為5-10。

#skip_networking   

#開啟該選可以徹底關閉MYSQL的TCP/IP連接配接方式,如果WEB伺服器是以遠端連接配接的方式通路MYSQL資料庫伺服器的,則不要開啟該選項,否則将無法正常連接配接。

#log-queries-not-using-indexes

将沒有使用索引的查詢也記錄下來