MYSQL優化參數配置


1、back_log=500

back_log值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。

當MySql的連接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數量即back_log。
如果等待連接的數量超過back_log,將不被授予連接資源。
將會報:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進程時。 back_log值不能超過TCP/IP連接的偵聽隊列的大小。若超過則無效,查看當前系統的TCP/IP連接的偵聽隊列的大小命令: cat /proc/sys/net/ipv4/tcp_max_syn_backlog目前系統為1024。 查看mysql 當前系統默認back_log值,命令: show variables like 'back_log'; 查看當前數量

2、 wait_timeout=1800(單位為秒)

MySQL客戶端的數據庫連接閑置最大時間值。

當MySQL連接閑置超過一定時間后將會被強行關閉。
MySQL默認的wait-timeout  值為8個小時,
可以通過命令show variables like 'wait_timeout'查看結果值。

interactive_timeout:服務器關閉交互式連接前等待活動的秒數。

wait_timeout:服務器關閉非交互連接之前等待活動的秒數。

這兩個參數必須配合使用。否則單獨設置wait_timeout無效

3、 max_connections=3000

max_connections是指MySql的最大連接數。
如果服務器的並發連接請求量比較大,建議調高此值,以增加並行連接數量。
當然這建立在機器能支撐的情況下,因為如果連接數越多,介於MySql會為每個連接提供連接緩沖區,就會開銷越多的內存,所以要適當調整該值,不能盲目提高設值。 可以過'conn%'通配符查看當前狀態的連接數量,以定奪該值的大小。 MySQL服務器允許的最大連接數16384; 查看系統當前最大連接數: show variables like 'max_connections';

4、 max_user_connections=800

max_user_connections是指每個數據庫用戶的最大連接

針對某一個賬號的所有客戶端並行連接到MYSQL服務的最大並行連接數。
簡單說是指同一個賬號能夠同時連接到mysql服務的最大連接數。設置為0表示不限制。 目前默認值為:0不受限制。 查看max_user_connections值 show variables like 'max_user_connections';

5、 thread_concurrency=64

thread_concurrency的值的正確與否, 對mysql的性能影響很大。
在多個cpu(或多核)的情況下,錯誤設置了thread_concurrency的值, 會導致mysql不能充分利用多cpu(或多核), 出現同一時刻只能一個cpu(或核)在工作的情況。 thread_concurrency應設為CPU核數的2倍. 比如有一個雙核的CPU, 那thread_concurrency 的應該為4; 2個雙核的cpu, thread_concurrency的值應為8. 查看系統當前thread_concurrency默認配置命令: show variables like 'thread_concurrency';

6、skip-name-resolve

skip-name-resolve:禁止MySQL對外部連接進行DNS解析。

使用這一選項可以消除MySQL進行DNS解析的時間。

但需要注意,如果開啟該選項,則所有遠程主機連接授權都要使用IP地址方式,否則MySQL將無法正常處理連接請求!

7、skip-networking建議被注釋掉,不要開啟

開啟該選項可以徹底關閉MySQL的TCP/IP連接方式。

如果WEB服務器是以遠程連接的方式訪問MySQL數據庫服務器則不要開啟該選項,否則將無法正常連接。

8、default-storage-engine= InnoDB

設置創建數據庫及表默認存儲類型

show table status like ‘tablename’顯示表的當前存儲狀態值

查看MySQL有哪些存儲狀態及默認存儲狀態

 show engines;

創建表並指定存儲類型

CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB;

修改表存儲類型:

  Alter table tableName engine =engineName

 

備注:設置完后把以下幾個開啟:

# Uncomment the following if you are using InnoDB tables

innodb_data_home_dir =/usr/local/mysql

#innodb_data_file_path = ibdata1:1024M;ibdata2:10M:autoextend(要注釋掉,否則會創建一個新的把原來的替換的。)

innodb_log_group_home_dir = /usr/local/mysql

# You can set .._buffer_pool_size up to 50 - 80 %

# of RAM but beware of setting memory usage too high

innodb_buffer_pool_size = 1000M

innodb_additional_mem_pool_size = 20M

# Set .._log_file_size to 25 % of buffer pool size

innodb_log_file_size = 500M

innodb_log_buffer_size = 20M

innodb_flush_log_at_trx_commit = 0

innodb_lock_wait_timeout = 50

設置完后一定記得把MySQL安裝目錄地址下的ib_logfile0和ib_logfile1刪除掉。否則重啟MySQL起動失敗。

9、全局緩存

key_buffer_size(默認值:402653184,即384M)

innodb_buffer_pool_size(默認值:134217728即:128M)

innodb_additional_mem_pool_size(默認值:8388608即:8M)

innodb_log_buffer_size(默認值:8388608即:8M)

query_cache_size(默認值:33554432即:32M)

通過命令如:show variables like '變量名';查看

10、key_buffer_size=400M

用於索引塊的緩沖區大小,增加它可得到更好處理的索引(對所有讀和多重寫),對MyISAM表性能影響最大的一個參數。

如果太大,系統將開始換頁並且真的變慢了。

嚴格說是它決定了數據庫索引處理的速度,尤其是索引讀的速度。

對於內存在4GB左右的服務器該參數可設置為256M或384M。

如何判斷key_buffer_size的設置是否合理?
檢查狀態值Key_read_requests和Key_reads
key_reads / key_read_requests應該盡可能的低,
比如1:100,1:1000 ,1:10000。
其值可以用以下命令查得:show status like 'key_read%';

11、innodb_buffer_pool_size=1024M(1G)

主要針對InnoDB表性能影響最大的一個參數。功能與Key_buffer_size一樣。

另外InnoDB和 MyISAM 存儲引擎不同。
 MyISAM 的 key_buffer_size 只能緩存索引鍵,而 innodb_buffer_pool_size 卻可以緩存數據塊和索引鍵。
適當的增加這個參數的大小,可以有效的減少 InnoDB 類型的表的磁盤 I/O 。

可以通過 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計算緩存命中率。
並根據命中率來調整 innodb_buffer_pool_size 參數大小進行優化。 值可以用以下命令查得: show status like 'Innodb_buffer_pool_read%'; 命中率越高越好

12、 innodb_additional_mem_pool_size=20M

innodb_additional_mem_pool_size 設置了InnoDB存儲引擎用來存放數據字典信息以及一些內部數據結構的內存空間大小,
所以當MySQL Instance中的數據庫對象非常多的時候,是需要適當調整該參數的大小以確保所有數據都能存放在內存中提高訪問效率的。 這個參數大小是否足夠還是比較容易知道的,因為當過小的時候,MySQL會記錄Warning信息到數據庫的error log中,這時候就該調整這個參數大小了。 查看當前系統mysql的error日志 cat /var/lib/mysql/機器名.error 發現有很多waring警告。所以要調大為20M. 根據MySQL手冊,對於2G內存的機器,推薦值是20M。 32G內存的 100M

13、innodb_log_buffer_size=20M

innodb_log_buffer_size  這是InnoDB存儲引擎的事務日志所使用的緩沖區。類似於Binlog Buffer,InnoDB在寫事務日志的時候,
為了提高性能,也是先將信息寫入Innofb Log Buffer中,當滿足innodb_flush_log_trx_commit參數所設置的相應條件(或者日志緩沖區寫滿)之后,
才會將日志寫到文件 (或者同步到磁盤)中。可以通過innodb_log_buffer_size 參數設置其可以使用的最大內存空間。 InnoDB 將日志寫入日志磁盤文件前的緩沖大小。
理想值為 1M 至 8M。大的日志緩沖允許事務運行時不需要將日志保存入磁盤而只到事務被提交(commit)。
因此,如果有大的事務處理,設置大的日志緩沖可以減少磁盤I/O。 在 my.cnf中以數字格式設置。 默認是8MB,系的如頻繁的系統可適當增大至4MB~8MB。當然如上面介紹所說,這個參數實際上還和另外的flush參數相關。一般來說不建議超過32MB

14、query_cache_size=40M

query_cache_size: 主要用來緩存MySQL中的ResultSet,也就是一條SQL語句執行的結果集。

Query Cache也有一個致命的缺陷,那就是當某個表的數據有任何任何變化,都會導致所有引用了該表的select語句在Query Cache中的緩存數據失效。
所以,當我們的數據變化非常頻繁的情況下,使用Query Cache可能會得不償失 Query Cache的使用需要多個參數配合,其中最為關鍵的是query_cache_size和query_cache_type,
前者設置用於緩存 ResultSet的內存大小,后者設置在何場景下使用Query Cache 可以通過命令: show status like 'Qcache_%';查看目前系統Query catch使用大小

15、read_buffer_size=4M

read_buffer_size 是MySql讀入緩沖區大小。

對表進行順序掃描的請求將分配一個讀入緩沖區,MySql會為它分配一段內存緩沖區。

read_buffer_size變量控制這一緩沖區的大小。

如果對表的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及內存緩沖區大小提高其性能.

16、sort_buffer_size=4M

sort_buffer_size是MySql執行排序使用的緩沖大小。

如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。

如果不能,可以嘗試增加sort_buffer_size變量的大小

17、read_rnd_buffer_size=8M

read_rnd_buffer_size 是MySql的隨機讀緩沖區大小。

當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。

進行排序查詢時,MySql會首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數據,可適當調高該值。

但MySql會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大。

18、tmp_table_size=16M

tmp_table_size是MySql的heap (堆積)表緩沖大小。所有聯合在一個DML指令內完成,並且大多數聯合甚至可以不用臨時表即可以完成。大多數臨時表是基於內

存的(HEAP)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含BLOB列的表存儲在硬盤上。
如果某個內部heap(堆積)表大小超過tmp_table_size,MySQL可以根據需要自

動將內存中的heap表改為基於硬盤的MyISAM表。
還可以通過設置tmp_table_size選項來增加臨時表的大小。
也就是說,如果調高該值,MySql同時將增加heap表的大小,可達到提高聯接查詢速度的效果。

19、thread_cache_size=64

默認的thread_cache_size=8

 根據物理內存設置規則如下:
1G —> 8
2G —> 16
3G —> 32     >3G —> 64

  mysql> show status like 'thread%';
+——————-+——-+
| Variable_name     | Value |
+——————-+——-+
| Threads_cached    | 0     |  <—當前被緩存的空閑線程的數量
| Threads_connected | 1     |  <—正在使用(處於連接狀態)的線程
| Threads_created   | 1498  |  <—服務啟動以來,創建了多少個線程
| Threads_running   | 1     |  <—正在忙的線程(正在查詢數據,傳輸數據等等操作)
+——————-+——-+

查看開機起來數據庫被連接了多少次?

mysql> show status like '%connection%';
+———————-+——-+
| Variable_name        | Value |
+———————-+——-+
| Connections          | 1504  |          –>服務啟動以來,歷史連接數
| Max_used_connections | 2     |
+———————-+——-+

通過連接線程池的命中率來判斷設置值是否合適?命中率超過90%以上,設定合理。

 (Connections -  Threads_created) / Connections * 100 %

 


免責聲明!

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



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