優化MySQL Server

 

1 查看Mysql server當前參數

 

1. 查看服務器參數默認值:

mysqld --verbose --help

2. 查看服務器參數實際值:

shell> mysqladmin variables

或者

mysql> SHOW VARIABLES;

3. 查看服務器運行狀態值:

shell> mysqladmin extended-status

或者

mysql>SHOW STATUS

 

 

2 影響Mysql性能的重要參數

 

1 key_buffer_size的設置

 

說明:鍵緩存(變量key_buffer_size)被所有線程共享;服務器使用的其它緩存則根據需要分配。此參數只適用於myisam存儲引擎。

使用方法:

mysql5.1以後提供了多個key_buffer,可以將指定的表索引緩存入指定的key_buffer,這樣可以更小的降低線程之間的競爭,相關語法如下:

 

例如,下面的語句將表t1t2t3的索引分配給名爲hot_cache的 鍵高速緩衝:

mysql> CACHE INDEX t1, t2, t3 IN hot_cache;

 

可以用SET GLOBAL參數設置語句或使用服務器啓動選項設置在CACHE INDEX語句中引用的鍵高速緩衝的大小來創建鍵高速緩衝。例如:

mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;

 

要想刪除鍵高速緩衝,將其大小設置爲零:

mysql> SET GLOBAL keycache1.key_buffer_size=0;

請注意不能刪除默認鍵高速緩衝。刪除默認鍵高速緩衝的嘗試將被忽略

 

CACHE INDEX在一個表和 鍵高速緩衝之間建立一種聯繫,但每次服務器重啓時該聯繫被丟失。如果你想要每次服務器重啓時該聯繫生效,一個發辦法是使用選項文件:包括配置鍵高速緩衝的變量設定值,和一個init-file選項用來命名包含待執行的CACHE INDEX語句的一個文件。例如:

key_buffer_size = 4G

hot_cache.key_buffer_size = 2G

cold_cache.key_buffer_size = 2G

init_file=/path/to/data-directory/mysqld_init.sql

每次服務器啓動時執行mysqld_init.sql中的語句。 該文件每行應包含一個SQL語句。

 

下面的例子分配幾個表,分別對應hot_cachecold_cache

CACHE INDEX a.t1, a.t2, b.t3 IN hot_cache

CACHE INDEX a.t4, b.t5, b.t6 IN cold_cache

 

要想將索引預裝到緩存中,使用LOAD INDEX INTO CACHE語句。例如,下面的語句可以預裝表t1t2索引的非葉節點(索引塊)

mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;

 

鍵高速緩衝可以通過更新其參數值隨時重新構建。例如:

mysql> SET GLOBAL cold_cache.key_buffer_size=4*1024*1024

如果你很少使用MyISAM表,那麼也保留低於 16-32MB key_buffer_size 以適應給予磁盤的臨時表索引所需。

 

2 table_cache的設置

 

說明:數據庫中打開表的緩存數量。 table_cachemax_connections有關。

例如,對於200個並行運行的連接,應該讓表的緩存至少有200 * N,這裏N是可以執行的查詢的一個聯接中表的最大數量。還需要爲臨時表和文件保留一些額外的文件描述符。

 

設置技巧:

可以通過檢查mysqld的狀態變量Opened_tables確定表緩存是否太小:

mysql> SHOW STATUS LIKE 'Opened_tables';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Opened_tables | 2741 |

+---------------+-------+

如果值很大, 即使你沒有發出許多FLUSH TABLES語句, 也應增加表緩存的大小。

 

 

 

3 innodb_buffer_pool_size的設置:

 

 

緩存InnoDB數據和索引的內存緩衝區的大小。你把這個值設得越高,訪問表中數據需要得磁盤I/O越少。 在一個專用的數據庫服務器上, 你可以設置這個參數達機器物理內存大小的80%。儘管如此,還是不要把它設置得太大,因爲對物理內存的競爭可能在操作系統上導致內存調度。

 

 

 

4 innodb_flush_log_at_trx_commit的設置:

 

0:日誌緩衝每秒一次地被寫到日誌文件, 並且對日誌文件做到磁盤操作的刷新,但是在一個事務提交不做任何操作。

1:在每個事務提交時,日誌緩衝被寫到日誌文件,對日誌文件做到磁盤操作的刷新。

2:在每個提交,日誌緩衝被寫到文件,但不對日誌文件做到磁盤操作的刷新。對日誌文件每秒刷新一次。

 

默認值是1,也是最安全的設置,即每個事務提交的時候都會從log buffer寫到日誌文件,而且會實際刷新磁盤,但是這樣性能有一定的損失。

如果可以容忍在數據庫崩潰的時候損失一部分數據,那麼設置成0或者2都會有所改善。設置成0, 則在數據庫崩潰的時候會丟失那些沒有被寫入日誌文件的事務,最多丟失1秒鐘的事務,這種方式是最不安全的,也是效率最高的。設置成2的時候,因爲只是沒有刷新到磁盤, 但是已經寫入日誌文件, 所以只要操作系統沒有崩潰, 那麼並沒有丟失數據,比設置成0更安全一些。

mysql的手冊中,爲了確保事務的持久性和複製設置的耐受性、一致性,都是建議將這個參數設置爲1的。

 

5 innodb_additional_mem_pool_size

 

InnoDB用來存儲數據目錄信息和其它內部數據結構的內存池的大小。默認值是1MB。應用程序裏的表越多,你需要在這裏分配越多的內存。

如果InnoDB用光了這個池內的內存,InnoDB開始從操作系統分配內存,並且往MySQL錯誤日誌寫警告信息。

沒有必要給這個緩衝池分配非常大的空間, 在應用相對穩定的情況下,這個緩衝池的大小也相對穩定。

 

 

6 innodb_table_locks

 

InnoDB重視LOCK TABLES,直到所有其它線程已經釋放他們所有對錶的鎖定,MySQL才從LOCK TABLE .. WRITE返回。默認值是1,這意爲LOCK TABLESInnoDB內部鎖定一個表。 在使用AUTOCOMMIT=1的應用裏,InnoDB的內部表鎖定會導致死鎖。

可以通過設置innodb_table_locks=0 來消除這個問題。

 

 

 

7 innodb_lock_wait_timeout

 

Mysql可以自動的監測行鎖導致的死鎖並進行相應的處理,但是對於表鎖導致的死鎖不能自動的監測, 所以該參數主要被用來在出現類似情況的時候對鎖定進行的後續處理。默認值是50秒,根據應用的需要進行調整。

 

 

8 innodb_support_xa

 

通過該參數設置是否支持分佈式事務,默認值是ON或者1,表示支持分佈式事務。如果確認應用中不需要使用分佈式事務,則可以關閉這個參數, 減少磁盤刷新的次數並獲得更好的InnoDB性能。

 

 

9 innodb_doublewrite

 

 

默認地, InnoDB存儲所有數據兩次,第一次存儲到doublewrite緩衝,然後存儲到確實的數據文件。如果對性能的要求高於對數據完整性的要求,那麼可以通過--skip-innodb-doublewrite關閉這個設置。

 

 

10 innodb_log_buffer_size:

 

 

默認的設置在中等強度寫入負載以及較短事務的情況下, 服務器性能還可以。如果存在更新操作峯值或者負載較大, 就應該考慮加大它的值了。 如果它的值設置太高了, 可能會浪費內存 --它每秒都會刷新一次, 因此無需設置超過1秒所需的內存空間。通常 8-16MB 就足夠了。越小的系統它的值越小。

 

 

11 innodb_log_file_size

 

 

在高寫入負載尤其是大數據集的情況下很重要。 這個值越大則性能相對越高, 但是要注意到可能會增加恢復時間。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章