影響MySQL 性能的重要參數
14.2.1 key_buffer_size 的設置
說明:鍵緩存(變量key_buffer_size) 被所有線程共享;服務器使用的其它緩存則根據需要分配。此參數只適用於myisam 存儲引擎。
使用方法:
MySQL5.1 以前只允許使用一個系統默認的key_buffer
MySQL5.1 以後提供了多個key_buffer,可以將指定的表索引緩存入指定的
key_buffer,這樣可以更小的降低線程之間的競爭,相關語法如下:
例如,下面的語句將表t1、t2 和t3 的索引分配給名為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_cache 和cold_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 語句。例如,下面的語句可以預裝表t1 和t2 索引的非葉節點(索引塊):
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 以適應給予磁盤的臨時表索引所需。
14.2.2 table_cache的設置
說明:數據庫中打開表的緩存數量。table_cache 與max_connections 有關。例如,對於200 個並行運行的連接,應該讓表的緩存至少有200 * N,這裡N 是可以執行的查詢的一個聯接中表的最大數量。還需要為臨時表和文件保留一些額外的文件描述符。
設置技巧:
可以通過檢查MySQLd 的狀態變量Opened_tables 確定表緩存是否太小:
MySQL> SHOW STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
如果值很大,即使你沒有發出許多FLUSH TABLES 語句,也應增加表緩存的大小。
14.2.3 innodb_buffer_pool_size 的設置:
緩存InnoDB 數據和索引的內存緩沖區的大小。你把這個值設得越高,訪問表中數據需要得磁盤I/O 越少。在一個專用的數據庫服務器上,你可以設置這個參數達機器物理內存大小的80%。盡管如此,還是不要把它設置得太大,因為對物理內存的競爭可能在操作系統上導致內存調度。
14.2.4 innodb_flush_log_at_trx_commit 的設置:
0:日志緩沖每秒一次地被寫到日志文件,並且對日志文件做到磁盤操作的刷新,但是在一個事務提交不做任何操作。
1:在每個事務提交時,日志緩沖被寫到日志文件,對日志文件做到磁盤操作的刷新。
2:在每個提交,日志緩沖被寫到文件,但不對日志文件做到磁盤操作的刷新。
對日志文件每秒刷新一次。
默認值是1,也是最安全的設置,即每個事務提交的時候都會從log buffer 寫到日志文件,而且會實際刷新磁盤,但是這樣性能有一定的損失。如果可以容忍在數據庫崩潰的時候損失一部分數據,那麼設置成0 或者2 都會有所改善。設置成0,則在數據庫崩潰的時候會丟失那些沒有被寫入日志文件的事務,最多丟失1 秒鐘的事務,這種方式是最不安全的,也是效率最高的。設置成2 的時候,因為只是沒有刷新到磁盤,但是已經寫入日志文件,所以只要操作系統沒有崩潰,那麼並沒有丟失數據,比設置成0 更安全一些。
在MySQL 的手冊中,為了確保事務的持久性和復制設置的耐受性、一致性,都是建議將這個參數設置為1 的。
14.2.5 innodb_additional_mem_pool_size:
InnoDB 用來存儲數據目錄信息和其它內部數據結構的內存池的大小。默認值是1MB。應用程序裡的表越多,你需要在這裡分配越多的內存。如果InnoDB 用光了這個池內的內存,InnoDB 開始從操作系統分配內存,並且往MySQL 錯誤日志寫警告信息。
沒有必要給這個緩沖池分配非常大的空間,在應用相對穩定的情況下,這個緩沖池的大小也相對穩定。
14.2.6 innodb_table_locks:
InnoDB 重視LOCK TABLES,直到所有其它線程已經釋放他們所有對表的鎖定,MySQL 才從LOCK TABLE .. WRITE 返回。默認值是1,這意為LOCK TABLES 讓InnoDB內部鎖定一個表。在使用AUTOCOMMIT=1 的應用裡,InnoDB 的內部表鎖定會導致死鎖。
可以通過設置innodb_table_locks=0 來消除這個問題。
14.2.7 innodb_lock_wait_timeout:
MySQL 可以自動的監測行鎖導致的死鎖並進行相應的處理,但是對於表鎖導致的死鎖不能自動的監測,所以該參數主要被用來在出現類似情況的時候對鎖定進行的後續處理。默認值是50 秒,根據應用的需要進行調整。
14.2.8 innodb_support_xa:
通過該參數設置是否支持分布式事務,默認值是ON 或者1,表示支持分布式事務。如果確認應用中不需要使用分布式事務,則可以關閉這個參數,減少磁盤刷新的次數並獲得更好的InnoDB 性能。
14.2.9 innodb_doublewrite:
默認地,InnoDB 存儲所有數據兩次,第一次存儲到doublewrite 緩沖,然後存儲到確實的數據文件。如果對性能的要求高於對數據完整性的要求,那麼可以通過--skip-innodb-doublewrite 關閉這個設置。
14.2.10 innodb_log_buffer_size:
默認的設置在中等強度寫入負載以及較短事務的情況下,服務器性能還可以。如果存在更新操作峰值或者負載較大,就應該考慮加大它的值了。如果它的值設置太高了,可能會浪費內存-- 它每秒都會刷新一次,因此無需設置超過1 秒所需的內存空間。通常8-16MB 就足夠了。越小的系統它的值越小。
14.2.11 innodb_log_file_size:
在高寫入負載尤其是大數據集的情況下很重要。這個值越大則性能相對越高,但是要注意到可能會增加恢復時間。