【數據庫】——mysql參數調優

【前言】

      mysql調優視頻學習:https://www.bilibili.com/video/av49548134/?p=1

一、mysql調優

      數據庫優化一方面是找出系統的瓶頸,提高MySQL數據庫的整體性能,而另一方面需要合理的結構設計和參數調整,以提高用戶的相應速度,同時還要儘可能的節約系統資源,以便讓系統提供更大的負荷.

二、參數調優

      優化數據庫參數可以提高資源利用率,從而提高MySQL服務器性能.MySQL服務的配置參數都在my.cnf或my.ini,下面列出性能影響較大的幾個參數.

      1、key_buffer_size:索引緩衝區大小

      2、table_cache:能同時打開表的個數

      3、query_cache_size和query_cache_type:前者是查詢緩衝區大小,後者是前面參數的開關,0表示不使用緩衝區,1表示使用緩衝區,但可以在查詢中使用SQL_NO_CACHE表示不要使用緩衝區,2表示在查詢中明確指出使用緩衝區才用緩衝區,即SQL_CACHE.

      4、sort_buffer_size:排序緩衝區

三、附錄-其他參數列表

max_connections:允許客戶端併發連接的最大數量,默認值是151,一般將該參數設置爲500-2000


max_connect_errors:如果客戶端嘗試連接的錯誤數量超過這個參數設置的值,則服務器不再接受新的客戶端連接。可以通過清空主機的緩存來解除服務器的這種阻止新連接的狀態,通過FLUSH HOSTS或mysqladmin flush-hosts命令來清空緩存。這個參數的默認值是100,一般將該參數設置爲100000。


interactive_timeout:Mysql關閉交互連接前的等待時間,單位是秒,默認是8小時,建議不要將該參數設置超過24小時,即86400


wait_timeout:Mysql關閉非交互連接前的等待時間,單位是秒,默認是8小時,建議不要將該參數設置超過24小時,即86400


skip_name_resolve:如果這個參數設爲OFF,則MySQL服務在檢查客戶端連接的時候會解析主機名;如果這個參數設爲ON,則MySQL服務只會使用IP,在這種情況下,授權表中的Host字段必須是IP地址或localhost。
這個參數默認是關閉的


back_log:MySQL服務器連接請求隊列所能處理的最大連接請求數,如果隊列放滿了,後續的連接纔會拒絕。當主要的MySQL線程在很短時間內獲取大量連接請求時,這個參數會生效。接下來,MySQL主線程會花費很短的時間去檢查連接,然後開啓新的線程。這個參數指定了MySQL的TCP/IP監聽隊列的大小。如果MySQL服務器在短時間內有大量的連接,可以增加這個參數。
文件相關參數sync_binlog:控制二進制日誌被同步到磁盤前二進制日誌提交組的數量。當這個參數爲0的時候,二進制日誌不會被同步到磁盤;當這個參數設爲0以上的數值時,就會有設置該數值的二進制提交組定期同步日誌到磁盤。當這個參數設爲1的時候,所有事務在提交前會被同步到二進制日誌中,因而即使MySQL服務器發生意外重啓,任何二進制日誌中沒有的事務只會處於準備狀態,這會導致MySQL服務器自動恢復以回滾這些事務。這樣就會保證二進制日誌不會丟失事務,是最安全的選項;同時由於增加了磁盤寫,這對性能有一定降低。將這個參數設爲1以上的數值會提高數據庫的性能,但同時會伴隨數據丟失的風險。建議將該參數設爲2、4、6、8、16。


expire_logs_days:二進制日誌自動刪掉的時間間隔。默認值爲0,代表不會自動刪除二進制日誌。想手動刪除二進制日誌,可以執行 PURGE BINARY LOGS。


max_binlog_size:二進制日誌文件的最大容量,當寫入的二進制日誌超過這個值的時候,會完成當前二進制的寫入,向新的二進制日誌寫入日誌。這個參數最小值時4096字節;最大值和默認值時1GB。相同事務中的語句都會寫入同一個二進制日誌,當一個事務很大時,二進制日誌實際的大小會超過max_binlog_size參數設置的值。如果max_relay_log_size參數設爲0,則max_relay_log_size參數會使用和max_binlog_size參數同樣的大小。建議將此參數設爲512M。


local_infile:是否允許客戶端使用LOAD DATA INFILE語句。如果這個參數沒有開啓,客戶端不能在LOAD DATA語句中使用LOCAL參數。


open_files_limit:操作系統允許MySQL服務打開的文件數量。這個參數實際的值以系統啓動時設定的值、max_connections和table_open_cache爲基礎,使用下列的規則:

  1. 10 + max_connections + (table_open_cache * 2)
  2.  max_connections * 5
  3. MySQL啓動時指定open_files_limit的值

binlog_cache_size:在事務中二進制日誌使用的緩存大小。如果MySQL服務器支持所有的存儲引擎且啓用二進制日誌,每個客戶端都會被分配一個二進制日誌緩存。如果數據庫中有很多大的事務,增大這個緩存可以獲得更好的性能。
Binlog_cache_use和Binlog_cache_disk_use這兩個參數對於binlog_cache_size參數的優化很有用。binlog_cache_size參數只設置事務所使用的緩存,非事務SQL語句所使用的緩存由binlog_stmt_cache_size系統參數控制。建議不要將這個參數設爲超過64MB,以防止客戶端連接多而影響MySQL服務的性能。


max_binlog_cache_size:如果一個事務需要的內存超過這個參數,服務器會報錯"Multi-statement transaction required more than 'max_binlog_cache_size' bytes"。這個參數最大的推薦值是4GB,這是因爲MySQL不能在二進制日誌設爲超過4GB的情況下正常的工作。建議將該參數設爲binlog_cache_size*2。


binlog_stmt_cache_size:這個參數決定二進制日誌處理非事務性語句的緩存。如果MySQL服務支持任何事務性的存儲引擎且開啓了二進制日誌,每個客戶端連接都會被分配二進制日誌事務和語句緩存。如果數據庫中經常運行大的事務,增加這個緩存可以獲得更好的性能。


table_open_cache:所有線程能打開的表的數量。


thread_cache_size:MySQL服務緩存以重用的線程數。當客戶端斷開連接的時候,如果線程緩存沒有使用滿,則客戶端的線程被放入緩存中。如果有客戶端斷開連接後再次連接到MySQL服務且線程在緩存中,則MySQL服務會優先使用緩存中的線程;如果線程緩存沒有這些線程,則MySQL服務器會創建新的線程。如果數據庫有很多的新連接,可以增加這個參數來提升性能。如果MySQL服務器每秒有上百個連接,可以增大thread_cache_size參數來使MySQL服務器使用緩存的線程。通過檢查Connections和Threads_created狀態參數,可以判斷線程緩存是否足夠。這個參數默認的值是由下面的公式來決定的:8 + (max_connections / 100)建議將此參數設置爲300~500。線程緩存的命中率計算公式爲(1-thread_created/connections)*100%,可以通過這個公式來優化和調整thread_cache_size參數。


query_cache_size:爲查詢結果所分配的緩存。默認這個參數是沒有開啓的。這個參數的值應設爲整數的1024倍,如果設爲其他值則會被自動調整爲接近此數值的1024倍。這個參數最小需要40KB。建議不要將此參數設爲大於256MB,以免佔用太多的系統內存。


query_cache_min_res_unit:查詢緩存所分配的最小塊的大小。默認值是4096(4KB)。


query_cache_type:設置查詢緩存的類型。當這個參數爲0或OFF時,則MySQL服務器不會啓用查詢緩存;當這個參數爲1或ON時,則MySQL服務器會緩存所有查詢結果(除了帶有SELECT SQL_NO_CACHE的語句);當這個參數爲2或DEMAND時,則MySQL服務器只會緩存帶有SELECT SQL_CACHE的語句。


sort_buffer_size:每個會話執行排序操作所分配的內存大小。想要增大max_sort_length參數,需要增大sort_buffer_size參數。如果在SHOW GLOBAL STATUS輸出結果中看到每秒輸出的Sort_merge_passes狀態參數很大,可以考慮增大sort_buffer_size這個值來提高ORDER BY 和 GROUP BY的處理速度。建議設置爲1~4MB。當個別會話需要執行大的排序操作時,在會話級別增大這個參數。


read_buffer_size:爲每個線程對MyISAm表執行順序讀所分配的內存。如果數據庫有很多順序讀,可以增加這個參數,默認值是131072字節。這個參數的值需要是4KB的整數倍。這個參數也用在下面場景中:

  • 當執行ORDER BY操作時,緩存索引到臨時文件(不是臨時表)中;
  • 執行批量插入到分區表中;
  • 緩存嵌套查詢的執行結果。

read_rnd_buffer_size:這個參數用在MyISAM表和任何存儲引擎表隨機讀所使用的內存。當從MyISAM表中以鍵排序讀取數據的時候,掃描的行將使用這個緩存以避免磁盤的掃描。將這個值設到一個較大的值可以顯著提升ORDER BY的性能。然後,這個參數會應用到所有的客戶端連接,所有不應該將這個參數在全局級別設爲一個較大的值;在運行大查詢的會話中,在會話級別增大這個參數即可。


join_buffer_size:MySQL服務器用來作普通索引掃描、範圍索引掃描和不使用索引而執行全表掃描這些操作所用的緩存大小。通常,獲取最快連接的方法是增加索引。當不能增加索引的時候,使全連接變快的方法是增大join_buffer_size參數。對於執行全連接的兩張表,每張表都被分配一塊連接內存。對於沒有使用索引的多表複雜連接,需要多塊連接內存。通常來說,可以將此參數在全局上設置一個較小的值,而在需要執行大連接的會話中在會話級別進行設置。默認值是256KB。


net_buffer_length:每個客戶端線程和連接緩存和結果緩存交互,每個緩存最初都被分配大小爲net_buffer_length的容量,並動態增長,直至達到max_allowed_packet參數的大小。當每條SQL語句執行完畢後,結果緩存會縮小到net_buffer_length大小。不建議更改這個參數,除非你的系統有很少的內存,可以調整這個參數。如果語句需要的內存超過了這個參數的大小,則連接緩存會自動增大。net_buffer_length參數最大可以設置到1MB。不能在會話級別設置這個參數。


max_allowed_packet:網絡傳輸時單個數據包的大小。默認值是4MB。包信息緩存的初始值是由net_buffer_length指定的,但是包可能會增長到max_allowed_packet參數設置的值。如果要使用BLOB字段或長字符串,需要增加這個參數的值。這個參數的值需要設置成和最大的BLOB字段一樣的大小。max_allowed_packet參數的協議限制是1GB。這個參數應該是1024整數倍。


bulk_insert_buffer_size:MyISAM表使用一種特殊的樹狀緩存來提高批量插入的速度,如INSERT ... SELECT,INSERT ... VALUES (...),(...), ...,對空表執行執行LOAD DATA INFILE。這個參數每個線程的樹狀緩存大小。將這個參數設爲0會關閉這個參數。這個參數的默認值是8MB。


max_heap_table_size:這個參數設置用戶創建的MEMORY表允許增長的最大容量,這個參數用來MEMORY表的MAX_ROWS值。設置這個參數對已有的MEMORY表沒有影響,除非表重建或執行ALTER TABLE、TRUNCATE TABLE語句。這個參數也和tmp_table_size參數一起來現在內部in-memory表的大小。如果內存表使用頻繁,可以增大這個參數的值。


tmp_table_size:內部內存臨時表的最大內存。這個參數不會應用到用戶創建的MEMORY表。如果內存臨時表的大小超過了這個參數的值,則MySQL會自動將超出的部分轉化爲磁盤上的臨時表。在MySQL 5.7.5版本,internal_tmp_disk_storage_engine存儲引擎將作爲磁盤臨時表的默認引擎。在MySQL 5.7.5之前的版本,會使用MyISAM存儲引擎。如果有很多的GROUP BY查詢且系統內存充裕,可以考慮增大這個參數。


innodb_buffer_pool_dump_at_shutdown指定在MySQL服務關閉時,是否記錄InnoDB緩存池中的緩存頁,以縮短下次重啓時的預熱過程。通常和innodb_buffer_pool_load_at_startup參數搭配使用。innodb_buffer_pool_dump_pct參數定義了保留的最近使用緩存頁的百分比。


innodb_buffer_pool_dump_now:立刻記錄InnoDB緩衝池中的緩存頁。通常和innodb_buffer_pool_load_now搭配使用。


innodb_buffer_pool_load_at_startup:指定MySQL服務在啓動時,InnoDB緩衝池通過加載之前的緩存頁數據來自動預熱。通常和innodb_buffer_pool_dump_at_shutdown參數搭配使用。


innodb_buffer_pool_load_now:立刻通過加載數據頁來預熱InnoDB緩衝池,無需重啓數據庫服務。可以用來在性能測試時,將緩存改成到一個已知的狀態;或在數據庫運行報表查詢或維護後,將數據庫改成到一個正常的狀態。


MyISAM參數key_buffer_size:所有線程所共有的MyISAM表索引緩存,這塊緩存被索引塊使用。增大這個參數可以增加索引的讀寫性能,在主要使用MyISAM存儲引擎的系統中,可設置這個參數爲機器總內存的25%。如果將這個參數設置很大,比如設爲機器總內存的50%以上,機器會開始page且變得異常緩慢。可以通過SHOW STATUS 語句查看 Key_read_requests,Key_reads,Key_write_requests, and Key_writes這些狀態值。正常情況下Key_reads/Key_read_requests 比率應該小於0.01。數據庫更新和刪除操作頻繁的時候,Key_writes/Key_write_requests 比率應該接近1。


key_cache_block_size:key緩存的塊大小,默認值是1024字節。


myisam_sort_buffer_size:在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操作中,MyISAM索引排序使用的緩存大小。


myisam_max_sort_file_size:當重建MyISAM索引的時候,例如執行REPAIR TABLE、 ALTER TABLE、 或 LOAD DATA INFILE命令,MySQL允許使用的臨時文件的最大容量。如果MyISAM索引文件超過了這個值且磁盤還有充裕的空間,增大這個參數有助於提高性能。


myisam_repair_threads:如果這個參數的值大於1,則MyISAM表在執行Repair操作的排序過程中,在創建索引的時候會啓用並行,默認值爲1。


InnoDB參數innodb_buffer_pool_size:InnDB存儲引擎緩存表和索引數據所使用的內存大小。默認值是128MB。在以InnDB存儲引擎爲主的系統中,可以將這個參數設爲機器物理內存的80%。同時需要注意:

  • 設置較大物理內存時是否會引擎頁的交換而導致性能下降;
  • InnoDB存儲引擎會爲緩存和控制表結構信息使用部分內存,因而實際花費的內存會比設置的值大於10%;
  • 這個參數設置的越大,初始化內存池的時間越長。在MySQL 5.7.5版本,可以以chunk爲單位增加或減少內存池的大小。chunk的大小可以通過innodb_buffer_pool_chunk_size參數設定,默認值是128MB。內存池的大小可以等於或是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的整數倍。

innodb_buffer_pool_instancesInnoDB緩存池被分成的區域數。對於1GB以上大的InnoDB緩存,將緩存分成多個部分可以提高MySQL服務的併發性,減少不同線程讀緩存頁的讀寫競爭。每個緩存池有它單獨的空閒列表、刷新列表、LRU列表和其他連接到內存池的數據結構,它們被mutex鎖保護。這個參數只有將innodb_buffer_pool_size參數設爲1GB或以上時才生效。建議將每個分成的內存區域設爲1GB大小。


innodb_max_dirty_pages_pct:當Innodb緩存池中髒頁所佔的百分比達到這個參數的值時,InnoDB會從緩存中向磁盤寫入數據。默認值是75。


innodb_thread_concurrency:InnoDB存儲引擎可以併發使用的最大線程數。當InnoDB使用的線程超過這參數的值時,後面的線程會進入等待狀態,以先進先出的算法來處理。等待鎖的線程不計入這個參數的值。這個參數的範圍是0~1000。默認值是0。當這個參數爲0時,代表InnoDB線程的併發數沒有限制,這樣會導致MySQL創建它所需要的儘可能多的線程。設置這個參數可以參考下面規則:

  • 如果用戶線程的併發數小於64,可以將這個參數設爲0;
  • 如果系統併發很嚴重,可以先將這個參數設爲128,然後再逐漸將這個參數減小到96, 80, 64或其他數值,直到找到性能較好的一個數值。

innodb_flush_method:指定刷新數據到InnoDB數據文件和日誌文件的方法,刷新方法會對I/O有影響。如果這個參數的值爲空,在類Unix系統上,這個參數的默認值爲fsync;在Windows系統上,這個參數的默認值爲async_unbuffered。在類Unix系統上,這個參數可設置的值如下:

  • fsync:InnoDB使用fsync()系統函數來刷新數據和日誌文件,fsync是默認參數。
  • O_DSYNC:InnoDB使用O_SYNC函數來打開和刷新日誌文件,使用fsync()函數刷新數據文件
  • littlesync:這個選項用在內部性能的測試,目前MySQL尚不支持,使用這個參數又一定的風險
  • nosync:這個選項用在內部性能的測試,目前MySQL尚不支持,使用這個參數又一定的風險
  • O_DIRECT:InnoDB使用O_DIRECT(或者directio()在Solaris)函數打開數據文件,使用fsync()刷新數據文件和日誌文件
  • O_DIRECT_NO_FSYNC:在刷新I/O時,InnoDB使用O_DIRECT方式。

在有RAID卡和寫緩存的系統中,O_DIRECT有助於避免InnoDB緩存池和操作系統緩存之間的雙重緩存。在InnoDB數據和日誌文件放在SAN存儲上面的系統,默認值或O_DSYNC方法會對以讀爲主的數據庫起到加速作用。


innodb_data_home_dir:InnoDB系統表空間所使用的數據文件的物理路徑,默認路徑是MySQL數據文件路徑。如果這個參數的值爲空,可以在innodb_data_file_path參數裏使用絕對路徑


innodb_data_file_path:InnoDB數據文件的路徑和大小。


innodb_file_per_table:當這個參數啓用的時候,InnoDB會將新建表的數據和索引單獨存放在.ibd格式的文件中,而不是存放在系統表空間中。當這張表被刪除或TRUNCATE時,InnoDB表所佔用的存儲會被釋放。這個設定會開啓InnoDB的一些其他特性,比如表的壓縮。當這個參數關閉的時候,InnoDB會將表和索引的數據存放到系統表空間的ibdata文件中,這會有一個問題,因爲系統表空間不會縮小,這樣設置會導致空間無法回放。


innodb_undo_directory:InnoDB undo日誌所在表空間的物理路徑。和innodb_undo_logs、innodb_undo_tablespaces參數配合,來設置undo日誌的路徑,默認路徑是數據文件路徑。


innodb_undo_logs:指定InnoDB使用的undo日誌的個數。在MySQL 5.7.2版本,32個undo日誌被臨時表預留使用,並且這些日誌存放在臨時表表空間(ibtmp1)中。如果undo日誌只存放在系統表空間中,想要額外分配供數據修改事務用的undo日誌,innodb_undo_logs參數必須設置爲32以上的整數。如果你配置了單獨的undo表空間,要將innodb_undo_logs參數設爲33以上來分配額外供數據修改事務使用的undo日誌。每個undo日誌最多可以支持1024個事務。如果這個參數沒有設置,則它會設爲默認值128。


innodb_undo_tablespaces:undo日誌的表空間文件數量。默認,所有的undo日誌都是系統表空間的一部分。因爲在運行大的事務時,undo日誌會增大,將undo日誌設置在多個表空間中可以減少一個表空間的大小。undo表空間文件創建在innodb_undo_directory參數指定的路徑下,以undoN格式命名,N是以0開頭的一系列整數。undo表空間的默認大小爲10M。需要在初始化InnoDB前設置innodb_undo_tablespaces這個參數。在MySQL 5.7.2版本,在128個undo日誌中,有32個undo日誌是爲臨時表所預留的,有95個undo日誌供undo表空間使用。


innodb_log_files_in_group:InnoDB日誌組包含的日誌個數。InnoDB以循環的方式寫入日誌。這個參數的默認值和推薦值均是2。日誌的路徑由innodb_log_group_home_dir參數設定。


innodb_log_group_home_dir:InnoDB重做日誌文件的物理路徑,重做日誌的數量由innodb_log_files_in_group參數指定。如果不指定任何InnoDB日誌參數,MySQL默認會在MySQL數據文件路徑下面創建兩個名爲ib_logfile0、ib_logfile1的兩個重做日誌文件,它們的大小由innodb_log_file_size參數設定。


innodb_log_file_size日誌組中每個日誌文件的字節大小。所有日誌文件的大小(innodb_log_file_size * innodb_log_files_in_group)不能超過512GB。


innodb_log_buffer_size:InnoDB寫入磁盤日誌文件所使用的緩存字節大小。如果innodb_page_size參數爲32K,則默認值是8MB;如果innodb_page_size參數爲64K,則默認值是16MB。如果日誌的緩存設置較大,則MySQL在處理大事務時,在提交事務前無需向磁盤寫入日誌文件。建議設置此參數爲4~8MB。


innodb_flush_log_at_trx_commit:當提交相關的I/O操作被批量重新排列時,這個參數控制提交操作的ACID一致性和高性能之間的平衡。可以改變這個參數的默認值來提升數據庫的性能,但是在數據庫宕機的時候會丟失少量的事務。這個參數的默認值爲1,代表數據庫遵照完整的ACID模型,每當事務提交時,InnoDB日誌緩存中的內容均會被刷新到日誌文件,並寫入到磁盤。當這個參數爲0時,InnDB日誌緩存大概每秒刷新一次日誌文件到磁盤。當事務提交時,日誌緩存不會立刻寫入日誌文件,這樣的機制不會100%保證每秒都向日誌文件刷新日誌,當mysqld進程宕掉的時候可能會丟失持續時間爲1秒左右的事務數據。當這個參數爲2時,當事務提交後,InnoDB日誌緩存中的內容會寫入到日誌文件且日誌文件,日誌文件以大概每秒一次的頻率刷新到磁盤。在MySQL 5.6.6版本,InnoDB日誌刷新頻率由innodb_flush_log_at_timeout參數決定。通常將個參數設爲1。


innodb_flush_log_at_timeout:寫入或刷新日誌的時間間隔。這個參數是在MySQL 5.6.6版本引入的。在MySQL 5.6.6版本之前,刷新的頻率是每秒刷新一次。innodb_flush_log_at_timeout參數的默認值也是1秒刷新一次。


innodb_lock_wait_timeout:InnDB事務等待行鎖的時間長度。默認值是50秒。當一個事務鎖定了一行,這時另外一個事務想訪問並修改這一行,當等待時間達到innodb_lock_wait_timeout參數設置的值時,MySQL會報錯"ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction",同時會回滾語句(不是回滾整個事務)。如果想回滾整個事務,需要使用--innodb_rollback_on_timeout參數啓動MySQL。在高交互性的應用系統或OLTP系統上,可以減小這個參數來快速顯示用戶的反饋或把更新放入隊列稍後處理。在數據倉庫中,爲了更好的處理運行時間長的操作,可以增大這個參數。這個參數只應用在InnoDB行鎖上,這個參數對錶級鎖無效。這個參數不適用於死鎖,因爲發生死鎖時,InnoDB會立刻檢測到死鎖並將發生死鎖的一個事務回退。


innodb_fast_shutdown:InnoDB關庫模式。如果這個參數爲0,InnoDB會做一個緩慢關機,在關機前會做完整的刷新操作,這個級別的關庫操作會持續數分鐘,當緩存中的數據量很大時,甚至會持續幾個小時;如果數據庫要執行版本升級或降級,需要執行這個級別的關庫操作,以保證所有的數據變更都寫入到數據文件。如果這個參數的值是1(默認值),爲了節省關庫時間,InnoDB會跳過新操作,而是在下一次開機的時候通過crash recovery方式執行刷新操作。如果這個參數的值是2,InnoDB會刷新日誌並以冷方式關庫,就像MySQL宕機一樣,沒有提交的事務會丟失,在下一次開啓數據庫時,crash recovery所需要的時間更長;在緊急或排錯情形下,需要立刻關閉數據庫時,會使用這種方式停庫。

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