1. 程式人生 > >性能優化系列八:MYSQL的配置優化

性能優化系列八:MYSQL的配置優化

線程數 log_file 記錄日誌 查詢緩存 才有 actions log文件 lock 保存

一、關鍵配置

1. 配置文件的位置

MySQL配置文件

/etc/my.cnf 或者 /etc/my.cnf.d/server.cnf

幾個關鍵的文件:
.pid文件,記錄了進程id
.sock文件,是內部通信使用的socket接口,比3306快
.log文件,日誌文件
.cnf或.conf文件,配置文件
安裝目錄:basedir
數據目錄:datadir

2. 在哪裏保存你的數據

基本配置,指定數據目錄,my.cnf或者server.cnf

[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock,#這裏指定了一個特別的連接
basedir = /usr/local/mysql


datadir = /data/3306/data
[client]
port = 3306
socket = /data/3306/mysql.sock,在客戶端也要聲明它,命令行要用到

3. 查詢緩存要不要開

寫入頻繁的數據庫,不要開查詢緩存

query_cache_size
Query_cache裏的數據又怎麽處理呢?首先要把Query_cache和該表相關的語句全部置為失效,然後在寫入更新。那麽如果Query_cache非常大,該表的查詢結構又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎麽這麽慢了。所以在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。而且在高並發,寫入量大的系統,建議把該功能禁掉。
query_cache_limit
指定單個查詢能夠使用的緩沖區大小,缺省為1M
query_cache_min_res_unit
默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據查詢,就容易造成內存碎片和浪費

說明:禁掉查詢緩存的方法就是直接註釋掉查詢緩存的配置,如#query_cache_size=1M, 這樣就可以了

4. 其他需要開的緩存

讀緩存,線程緩存,排序緩存

sort_buffer_size = 2M
connection級參數。太大將導致在連接數增高時,內存不足。

max_allowed_packet = 32M
網絡傳輸中一次消息傳輸量的最大值。系統默認值 為1MB,最大值是1GB,必須設置1024的倍數。

join_buffer_size = 2M
和sort_buffer_size一樣,該參數對應的分配內存也是每個連接獨享

tmp_table_size = 256M
默認大小是 32M。GROUP BY 多不多的問題

max_heap_table_size = 256M
key_buffer_size = 2048M
索引的緩沖區大小,對於內存在4GB左右的服務器來說,該參數可設置為256MB或384MB。

read_buffer_size = 1M
read_rnd_buffer_size = 16M
進行排序查詢時,MySql會首先掃描一遍該緩沖,以避免磁盤搜索

bulk_insert_buffer_size = 64M
批量插入數據緩存大小,可以有效提高插入效率,默認為8M

Innodb緩存

innodb_buffer_pool_size = 2048M
只需要用Innodb的話則可以設置它高達 70-80% 的可用內存。一些應用於 key_buffer 的規則有 ——如果你的數據量不大,並且不會暴增,那麽無需把innodb_buffer_pool_size 設置的太大了。

innodb_additional_mem_pool_size = 16M
網絡傳輸中一次消息傳輸量的最大值。系統默認值為1MB,最大值是1GB,必須設置1024的倍數。

innodb_log_files_in_group = 3
循環方式將日誌文件寫到多個文件。推薦設置為3

innodb_lock_wait_timeout = 120
InnoDB 有其內置的死鎖檢測機制,能導致未完成的事務回滾。innodb_file_per_table = 0 獨享表空間,關閉

5. 連接數

open_files_limit = 10240
允許打開的文件數

back_log = 600
短時間內的多少個請求可以被存在堆棧中

max_connections = 3000
MySQL默認的最大連接數為100,MySQL服務器允許的最大連接數16384

max_connect_errors = 6000
設置每個主機的連接請求異常中斷的最大次數,當超過該次數,MYSQL服務器將禁止host的連接請求

thread_cache_size = 300
重新利用保存在緩存中線程的數量

thread_concurrency = 8
thread_concurrency應設為總CPU核數的2倍

thread_stack = 192K
每個線程的堆棧大小,默認值足夠大,可滿足普通操作。可設置範圍為128K至4GB,默認為192KB。

6. 線程池有關參數

線程池很少配

thread_handling
表示線程池模型。

thread_pool_size
表示線程池的group個數,一般設置為當前CPU核心數目。理想情況下,一個group一個活躍的工作線程,達到充分利用CPU的目的。

thread_pool_stall_limit
用於timer線程定期檢查group是否“停滯”,參數表示檢測的間隔。

thread_pool_idle_timeout
當一個worker空閑一段時間後會自動退出,保證線程池中的工作線程在滿足請求的情況下,保持比較低的水平。60秒

thread_pool_oversubscribe
該參數用於控制CPU核心上“超頻”的線程數。這個參數設置值不含listen線程計數。

threadpool_high_prio_mode
表示優先隊列的模式。

thread_pool_max_threads
限制線程池最大的線程數,超過將無法再創建更多的線程,默認為100000。

thread_pool_high_prio_tickets
最多語序多少次被放入高優先級隊列中,默認為4294967295。只有在thread_pool_high_prio_mode為transactions的時候才有效果

說明:

線程處理的最小單位是statement(語句)
線程池實現在server端,通過創建一定數量的線程服務DB請求,相對於one-conection-per-thread的一個線程服務一個連接的方式,線程池服務的最小單位是語句,即一個線程可以對應多個活躍的連接。

7. 慢查詢日誌

slow_query_log
是否開啟慢查詢日誌,1表示開啟,0表示關閉。

log-slow-queries
舊版(5.6以下版本)MySQL數據庫慢查詢日誌存儲路徑。可以不設置該參數,系統則會默認給一個缺省的文件host_name-slow.log

slow-query-log-file
新版(5.6及以上版本)MySQL數據庫慢查詢日誌存儲路徑。可以不設置該參數,系統則會默認給一個缺省的文件host_name-slow.log


long_query_time
慢查詢閾值,當查詢時間多於設定的閾值時,記錄日誌。

log_queries_not_using_indexes
未使用索引的查詢也被記錄到慢查詢日誌中(可選項)。

log_output
日誌存儲方式。log_output=‘FILE‘表示將日誌存入文件,默認值是‘FILE‘。log_output=‘TABLE‘表示將日誌存入數據庫,這樣日誌信息就會被寫入到mysql.slow_log表中。MySQL數據庫支持同時兩種日誌存儲方式,配置的時候以逗號隔開即可,如:log_output=‘FILE,TABLE‘。日誌記錄到系統的專用日誌表中,要比記錄到文件耗費更多的系統資源,因此對於需要啟用慢查詢日誌,又需要能夠獲得更高的系統性能,那麽建議優先記錄到文件。

二、監控工具

1. innotop工具

安裝:yum install innotop
啟動:innotop -u root -p ‘123’
幫助:?

技術分享圖片

說明:

innotop是一個實時工具,只能查看當前的情況,不能記錄歷史情況

查看幫助的時候輸入一個 ?

幫助裏面的ABCD.....U就是可以查看對應的指標的情況,如查詢列表輸入Q、查詢緩沖區輸入B、命令統計輸入C

2. lepus工具

http://www.lepus.cc/page/product

技術分享圖片

說明:

lepus是一款開源的數據庫監控工具,能監控各種數據庫,能監控多臺數據庫,能查看歷史情況

性能優化系列八:MYSQL的配置優化