mysql服務性能優化—my.cnf配置說明詳解

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_cache這個值的大小了。還有就是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() 來進行內存分配,導致效率降低。




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  
#在MyISAM引擎優化中,這個參數也是一個重要的優化參數。但也爆露出來一些問題。機器的內存越來越大,習慣性把參數分配的值越來越大。這個參數加大 後也引發了一系列問題。我們首先分析一下 query_cache_size的工作原理:一個SELECT查詢在DB中工作後,DB會把該語句緩存下來,當同樣的一個SQL再次來到DB裏調用 時,DB在該表沒發生變化的情況下把結果從緩存中返回給Client。這裏有一個關建點,就是DB在利用Query_cache工作時,要求該語句涉及的 表在這段時間內沒有發生變更。那如果該表在發生變更時,Query_cache裏的數據又怎麼處理呢?首先要把Query_cache和該表相關的語句全 部置爲失效,然後在寫入更新。那麼如果Query_cache非常大,該表的查詢結構又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這 樣看到的就是Update或是Insert怎麼這麼慢了。所以在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。而且在高併發,寫入量大的 系統,建議把該功能禁掉。




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 COMMITTE-讀已提交


REPEATABLE READ -可重複讀


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,設置爲2表示不寫入硬盤而是寫入系統緩存,日誌會每秒flush到硬盤,所以一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值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
將沒有使用索引的查詢也記錄下來






mysql的監控方法大致分爲兩類:
1.連接到mysql數據庫內部,使用show status,show variables,flush status 來查看mysql的各種性能指標。
2. 直接使用mysqladmin查看其性能指標


mysqladmin兩個參數,status,extended-status
shell > mysqladmin  -uroot -ppassword  variables status


Uptime: 4557887      #mysql運行的秒數
Threads: 1           #連接數
Questions: 1684130    #The number of questions (queries) from clients since the server was started.
Slow queries: 0      #The number of queries that have taken more than long_query_time seconds
Opens: 221872     #The number of tables the server has opened.
Flush tables: 1     #The number of flush-*, refresh, and reload commands the server has executed.
Open tables: 64     #The number of tables that currently are open.
Queries per second avg: 0.369  #從上次運行開始計算,每秒鐘平均查詢次數


最完整的信息


shell > mysqladmin  -uroot -ppassword  variables extended-status


注:value 值的單位是byte ,要得到M ,需除以2次1024


Uptime    4405546     MySQL服務器已經運行的秒數


auto_increment_increment      1    控制列中的值的增量值(步進量)                                    
auto_increment_offset         1    確定AUTO_INCREMENT列值的初始值。
兩個變量值只能爲1到65,535之間的整數值。設置爲非整數值,則會給出錯誤。這兩個變量影響AUTO_INCREMENT列。


一般不去更改。更改方法:mysql> SET @auto_increment_offset=5;




max_connections            100
table_cache                64
open_files_limit           1024
Open_tables                64  是當前打開的表的數量
Opened_tables              187690  表示打開過的表數量
幾個參數的關係:
table_cache * 2 + max_connections=max_open_files


max_connections 默認爲100


mysql>show full processlist;




max_open_files 由 open_files_limit 參數決定。
mysql打開的最大文件數,受兩個參數的影響:系統打開的最大文件數(ulimit -n)和   open_files_limit 。
加大max_open_files的值
-------------------------------------------------------------
在/etc/my.cnf加入open_files_limit=8192
在/etc/security/limits.conf添加
*               soft    nofile          8192
*               hard    nofile          8192


最好用sysctl或者修改/etc/sysctl.conf文件,同時還要在配置文件中把open_files_limit這個參數增大,對於4G內存服務器,open_files_limit至少要增大到4096,非特殊情況,設置成8192就可以了。




mysql>SHOW STATUS;   (服務器狀態變量,運行服務器的統計和狀態指標)
mysql>SHOW VARIABLES;(服務器系統變量,實際上使用的變量的值)
或者


mysql>SHOW STATUS LIKE  '%變量名% ' ;


例如:mysql>show variables like 'innodb%';
mysql> flush tables;   清空表緩存
發佈了39 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章