目錄
前言
在上第一部分文章中《 MySQL 性能優化實戰,MySQL 性能調優和系統資源優化解決方案(一) 》完成了MySQL數據庫的結構優化、性能調優,接下來這部分主講系統資源調優、通過MySQL的系統配置參數實現。
服務器優化
八、服務器優化
1、優化服務器硬件
服務器的硬件性能直接決定着 MySQL數據庫的性能,硬件的性能瓶頸,直接決定 MySQL數據庫的運行速度和效率。
硬件服務器的優化需要從以下幾個方面考慮:
- 配置較大的內存,足夠大的內存,是提高 MySQL數據庫性能的方法之一。內存的 IO比硬盤快的多,可以增加系統的緩衝區容量,使數據在內存停留的時間更長,以減少磁盤的 IO;
- 配置高速磁盤,比如 SSD;
- 合理分配磁盤 IO,把磁盤 IO分散到多個設備上,以減少資源的競爭,提高並行操作能力;
- 配置多核處理器,MySQL 是多線程的數據庫,多處理器可以提高同時執行多個線程的能力;
2、優化 MySQL的參數
通過優化 MySQL的參數可以提高資源利用率,從而達到提高MySQL服務器性能的目的。在 MySQL交互模式下的命令:“ SHOW VARIABLES ”,如下圖:
MySQL 的配置參數都在 my.cnf或者 my.ini文件的 [mysqld] 組中,配置示例如下:
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
lower_case_table_names = 1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
九、MySQL 中的配置參數詳解
1)、MySQL 的基礎配置參數
參數名 |
說明 |
---|---|
user |
用戶名 |
bind-address |
綁定IP地址 |
port |
端口號 |
datadir |
數據文件存放目錄 |
basedir |
MySQL 應用程序存放目錄 |
socket |
socket 文件存放目錄文件 |
default-table-type |
配置系統默認引擎 |
2)、MySQL 查詢緩存配置參數
參數名 |
說明 |
---|---|
query_cache_size |
配置 MySQL的查詢緩存大小, 緩存大小的直接因素: 1、對DDL和DML語句的性能影響; |
query_cache_type |
查詢緩存類型。取值如下: 0 OFF,禁用查詢緩存功能; |
query_cache_limit |
查詢結果長度的長度限制,小於這個長度的數據才能被緩存 |
3)、MySQL 中 InnoDB 存儲引擎的配置參數
InnoDB 參數較少,內存的管理多由 InnoDB引擎自己負責,主要配置參數爲“innodb_buffer_pool_size”,參數分配的緩衝。
參數名 |
說明 |
---|---|
innodb_buffer_pool_size |
新開闢一片內存用於緩存 InnoDB引擎表的數據和索引,一般設置爲機器內存的50%-80%(關鍵參數) |
innodb_log_buffer_size |
InnoDB 日誌緩衝區大小 |
innodb_flush_method |
刷新日誌的方法 |
innodb_additional_mem_pool_size |
開闢一片內存用於緩存 InnoDB引擎的數據字典信息和內部數據結構(比如:自適應HASH索引結構),默認值:build-in版本默認值爲:1M;Plugin-innodb版本默認值爲:8M; 注:若是 mysqld服務上的表對象數量較多,InnoDB引擎數據量很大,且 innodb_buffer_pool_size的值設置較大,則應該適當地調整 innodb_additional_mem_pool_size的值。若是出現緩存區的內存不足,則會直接向操作系統申請內存分配,並且會向 MySQL的 error日誌文件寫入警告信息; |
innodb_data_home_dir |
InnoDB 數據文件的目錄 |
innodb_data_file_path |
數據文件配置 |
innodb_log_files_in_group |
InnoDB 日誌的 |
innodb_log_file_size |
指定 InnoDB 日誌文件的大小 |
innodb_lock_wait_timeout |
等待鎖的超時時間,避免死鎖 |
innodb_flush_log_at_trx_commit |
日誌提交方式 (關鍵參數): 0,每秒寫1次日誌,將數據刷入磁盤,相當於每秒提交一次事務; 1,每次提交事務寫日誌,同時刷新相應磁盤 -> 默認參數; 2,每提交事務寫一次日誌,但每隔一秒刷新一次相應的磁盤文件; |
innodb_force_recovery |
在 InnoDB 的自動恢復失敗後,從崩潰中強制啓動,有1-6個級別,數值越低恢復的方式也保守,默認爲4。儘量使用較保守方式恢復。恢復後要註釋刪除這一行。 |
4)、MySQL 中 MyISAM 存儲引擎的配置參數
參數名 |
說明 |
---|---|
key_buffer_size |
索引塊用的緩衝區大小,所有的連接程序線程共用(關鍵參數) key_buffer_size只緩存MyISAM或MyISAM引擎的索引數據,而 innodb_buffer_pool_size不僅能緩存索引數據,還能緩存元數據,但是對於只使用 InnoDB引擎的數據庫而言,此參數值也不能設置過於偏小,因爲臨時表可能會使用到此緩存空間,推薦大小:64M。 |
key_cache_block_size |
每一個索引 Block 的大小,默認 1024 字節,從4.1.1後纔出現這個參數,原來都是直接採用 1024 字節作爲 Block 的長度 |
5)、MySQL 日誌配置參數
MySQL中日誌是監控數據庫系統的重要途徑。MySQL的日誌分爲6種:查詢日誌、慢查詢日誌、變更日誌、二進制變更日誌、告警日誌、錯誤日誌。
參數名 |
說明 |
---|---|
log |
查詢日誌,記錄所有的 MySQL的命令操作,在跟蹤數據庫運行時非常有幫助 |
log-slow-queries |
慢查詢日誌 |
log-update |
變更日誌,用文本方式記錄所有改變數據的變更操作 |
log-bin |
二進制變更日誌,更加緊湊,使用mysqlbinlog讀取,操作,轉換 |
log-warnings |
告警日誌 |
log-error |
錯誤日誌 |
binlog_cache_size |
臨時存放某次事務的 SQL語句緩衝長度 |
max_binlog_cache_szie |
最大的二進制緩存日誌緩衝區大小 |
max_binlog_size |
最大的二進制日誌大小 |
long_query_time |
慢查詢時間限度,超過這個限度,MySQL 將認爲是一個慢查詢,並記錄到慢查詢日誌中 |
log-queries-not-using-indexes |
沒有使用索引查詢的日誌,方便記錄長時間訪問的查詢進行優化 |
6)、MySQL 連接通信參數配置
參數名 |
說明 |
---|---|
max_connections |
MySQL 的最大連接數,該值一般情況下都會設值在128-1024的範圍,再結合實際業務可能的最大事務併發度。 |
max_connect_errors |
同一個連接地址最大錯誤連接數,防止惡意攻擊,默認值爲10,也即 mysqld線程沒重新啓動過,一臺物理服務器只要連接異常中斷累計超過10次,就再也無法連接上 mysqld服務;若異常中斷累計超過參數設置的值,有兩種解決方案,執行命令:FLUSH HOSTS 或者重新啓動 mysqld服務。 |
net_buffer_length |
服務器和客戶端之間通訊,使用的緩衝區長度,單位:字節 |
max_allowed_packet |
服務器和客戶端之間最大的通信緩衝區長度,單位:字節 |
net_read_timeout |
讀取超時 |
net_write_timeout |
寫入超時 |
interactive_timeout |
交互模式下,沒有操作後的超時時間,單位:秒 |
wait_ timeout |
非交互模式,沒有操作後的超時時間,此參數只對基於 TCP/IP或基於 Socket通信協議建立的連接纔有效,單位:秒 |
7)、MySQL 的Buffer緩衝區參數設置
在前面一篇文章MySQL的MyCat中間件《 Mycat中的兩個主要Buffer池,BufferPool的二級緩存 》中介紹到了Buffer 池的概念,以及其設值的規則,和這兒的 Buffer 類似,但又不同。
參數名 |
說明 |
---|---|
read_buffer_size |
讀取緩衝區大小 |
write_buffer_size |
寫入緩衝區大小,MyISAM 特有的 |
read_rnd_buffer_size |
在經過排序後,讀取的結果集數據緩衝區大小 |
sort_buffer_size |
數據排序的緩衝區大小 |
join_buffer_size |
關聯操作緩衝區大小 |
myisam_sort_buffer_szie |
爲索引的重新排序操作分配的緩衝區的大小 |
8)、MySQL 性能優化的其它配置參數
關閉某些系統項,可以加快 MySQL的運行速度
參數名 |
說明 |
---|---|
skip-openssl |
關閉 MySQL服務器對SSL加密的支持 |
skip-isam |
關閉 MySQL服務器對 ISAM引擎的支持 |
skip-bdb |
關閉 MySQL服務器對 BDB引擎的支持 |
skip-external-locking |
關閉外部鎖,MySQL的外部鎖用於防止其他程序修改正在使用的數據文件,但在部分系統上不可靠,一般都不使用。 |
skip-innodb |
關閉 MySQL服務器對 InnoDB引擎的支持 |
skip_networking |
關閉 MySQL服務器的遠程訪問,只能從本地訪問數據庫 |
MySQL 磁盤寫操作的優化參數:
delay_key_write、flush、flush_time配置參數,可以進一步提高 MyISAM引擎的性能,但在服務器宕機的時候,可能會導致業務數據丟失或數據表損壞的情況。
delay_insert_limit、delay_insert_timeout配置參數,在 MySQL中對於插入語句控制,如果有配置此參數,MySQL 會將新進的插入語句放入到一個隊列中,而不是不馬上讀入到磁盤。
delay_key_write配置參數,在 MySQL創建表的時候,如果表的主鍵發生改動,改動會緩衝在 key_buffer中,而不是立即回寫到磁盤。
參數名 |
說明 |
---|---|
delay_insert_limit |
INSERT DELAYED 語句選項。(插入語句的描述) 處理INSERT DELAYED語句,MYSQL插入delay_insert_limit條語句後檢查是否有查詢語句,如有有去查詢,如果沒有,則繼續插入 |
delay_insert_timeout |
在處理完INSERT DELAYED對列的插入數據後,MYSQL等待delay_insert_timeout秒後看看是否有INSERT DELAYED數據,如果有繼續,如果沒有結束這次操作。 |
delay_query_size |
INSERT DELAYED插入數據對列的長度 |
max_delayed_threads |
處理INSERT DELAYED語句的最大線程個數 |
delay_key_write |
對於使用DELAY_KEY_WRITE選項的創建的表,可以延緩鍵讀寫 0N 不延緩所有的鍵寫如操作 OFF延緩有DELAY_KEY_WRITE選項的標的鍵寫入操作 ALL延緩所有的表 |
flush |
是否要在每個操作後立即刷新數據表 |
flush_time |
每隔多少秒,對數據表進行一次刷新。關閉後打開。 |
十、MySQL 數據庫運行狀態檢查
通過命令 “ SHOW STATUS ” 進行查看,通過觀察其狀態來判斷當前數據庫中的表或者數據是否需要優化。例如,當前我們最常用的數據庫引擎是InnoDB,觀察其運行情況可入輸入命令 “ SHOW STATUS WHERE variable_name LIKE '%INNODB%'; ”,如下圖:
通過觀察可以看到,MySQL數據庫運行狀態大多爲類似於計數器的模式進行記錄的,可以通過 “ FLUSH STATUS ” 命令將所有運行狀態進行重置。
1)、常用的狀態監控參數
參數名 |
說明 |
---|---|
Aborted_clients |
因客戶沒有正確關閉而丟棄的連接數量,沒有正確關閉指沒有調用mysql_close就退出,連接超時,數據傳送中客戶端退出 |
Aborted_connects |
試圖連接MySQL服務器但沒有成功的次數 |
Bytes_received |
從客戶收到的字節總數 |
Bytes_send |
發送給客戶的字節總數 |
Com_XXX |
執行語句的計數器,比如Com_select變量記錄了select語句的個數 |
Connections |
試圖連接MySQL服務器的嘗試次數,(包括成功的和沒有成功) |
Created_tmp_disk_tables |
使用磁盤創建臨時表的次數,如果要創建的臨時表的尺寸大於tmp_table_size,那麼臨時表將創建在磁盤上, |
Created_tmp_tables |
創建臨時表的次數 |
Delayed_XXX |
INSERT DELAYED語句的執行性能參數 |
Handler_commit Handler_rollback |
事務提交或者回滾的次數 |
Handler_delete |
對數據表刪除一條記錄的次數 |
Handler_update |
對數據表修改一條記錄的次數 |
Handler_write |
對數據表插入一條記錄的次數 |
Handler_read_first |
讀取索引中第一個索引項的個數 |
Handler_read_key |
根據索引直接讀取一行數據的次數,這個數值高表示數據庫有較好的檢索能力。 |
Handler_read_next |
根據索引讀取下個數據行的請求次數. 在一個索引的區間內進行查詢( > < ,orderby 這類查詢條件)會影響這個計數器。 |
Handler_read_prev |
根據索引讀取前個數據行的請求次數.用於一些反序查詢。 |
Handler_read_rnd |
通過一個固定位置(應該就是不通過索引)讀取一個數據行的次數。這個數值很高表示你的很多查詢操作的結果需要排序,可能這些查詢操作不能適當使用索引而要檢索整個表。 |
Handler_read_rnd_next |
請求從數據文件中讀取下一個記錄的次數.如果有很多全表的檢索這個值將很高. 通常這表示數據表沒有合適的索引。 |
key_blocks_used |
索引緩衝區塊中已經被使用的區塊大小。Block的尺寸默認是1024字節,4.1.1後可以通過key_cache_block_size參數設置。可以根據key_buffer_size/(1024 or key_cache_block_size) 得到Block總數,然後知道key_buffer的利用率 |
Key_read_requests |
從緩衝讀取1個Block的次數 |
Key_read |
從磁盤讀取的次數 |
Key_write_requests |
寫入索引緩衝區寫入一個Block的次數 |
Key_write |
寫回磁盤的次數 |
Innodb_XXXX |
InnoDB的狀態技術器,不過只有MySQL 5.02的版本才支持這些計數器。這兒略過 |
Opened_tables |
曾經打開過的數據表總數 |
Open_tables |
當前處於打開的表個數 |
Open_files |
當前處於打開的文件個數 |
Qcache_free_blocks |
Qcache沒有使用的內存塊個數 |
Qcache_free_memory |
Qcache沒有使用的內存尺寸 |
Qcache_hits |
查詢在Qcache中的命中次數,和Com_select比較,就可以知道Qache的大約命中率是多少。 |
Qcache_inserts |
加入Cache中的查詢個數 |
Qcache_lowmem_prunes |
由於Qcache不夠用,造成替換出Qcache的查詢個數 |
Qcache_not_cached |
沒有能Cache的查詢個數 |
Slow_queries |
慢查詢的次數,如果一個查詢的所用的時間大於long_query_time設置的時間,則計數加1 |
Select_XXXX |
關聯查詢的一些狀態計數 |
Table_locks_waited |
必須等待後才能完成表鎖定的請求個數,如果這個數值和下面數值的比率過大,表示數據庫的性能較低 |
Table_locks_immediate |
無需等待,立即完成表鎖定的請求個數。 |
Thread_connected |
現在處在連接打開狀態的線程個數 |
Thread_cached |
現在在現場緩衝區的線程個數 |
Thread_created |
到目前爲止,創建的線程個數 |
Thead_running |
現在運行的線程個數,不是所有打開的線程都在運行,有些會處於SLEEP狀態 |
2)、其它補充參數
參數名 | 說明 |
---|---|
sync_binlog |
日誌提交方式(關鍵參數): 大於0,每次向二進制日誌文件寫入N條SQL或N個事務後,則把二進制日誌文件的數據刷新到磁盤上; 和 innodb_flush_log_at_trx_commit 配置使用(最佳推薦): |
innodb_file_per_table | 啓用單表空間,減少共享表空間維護成本,減少空閒磁盤空間釋放的壓力。另外,在數據量較大情況下的性能也會有提升,爲此,一般建議使用獨立表空間代替共享表空間的方式。 |
innodb_commit_concurrency |
同一時刻,允許多少個線程同時提交InnoDB事務,默認值爲0,範圍0-1000。取值定義: 0,允許任意數量的事務在同一時間點提交; |
innodb_concurrency_tickets | 同一時刻,能訪問 InnoDB引擎數據的線程數,默認值爲500,取值範圍1-4294967295。如果,當訪問 InnoDB引擎數據的線程數達到設值的上線,線程將會被放到隊列中,等待其他線程釋放 tickets後再進入,一般情況下保持默認即可夠用了。 |
innodb_fast_shutdown |
InnoDB引擎關閉的方式,默認值爲:1,表示正常關閉的,取值: 0,mysqld服務關閉前,先進行數據完全的清理和插入緩衝區的合併操作,若是髒數據較多或者服務器性能等因素,會導致此過程需要數分鐘或者更長時間; |
innodb_force_recovery |
mysqld服務出現崩潰之後,InnoDB引擎進行回滾的模式,默認值爲0。只有在需要從錯誤狀態的數據庫進行數據備份時,纔會設值 innodb_force_recovery,若是把此參數作爲安全選項,也可以把參數的值設置大於0,防止 InnoDB引擎的數據變更,取值:
推薦組合配置: |
lower_case_table_names | 在Linux或Unix中,對文件名稱大小寫敏感,也即對數據庫、表、存儲過程等對象名稱大小寫敏感,爲減少開發人員的開發成本,推薦設值該參數,值爲1,表示所有對象名稱都統一的自動轉換成小寫(重要參數) |
transaction-isolation | 事務隔離級別,隔離級別包括:read-uncommitted、read-committed、repeatable-read、serializable,默認值爲:repeatable-read,有關事務隔離級別設值詳情可參考MySQL事務隔離級別和日誌登記模式的選擇。 |
binlog-format |
複製的模式,可供設置的值:statement、row、mixed(注:5.0.x 只有 statement,5.1.x 版本默認設置:mixed),組合配置推薦: |
event_scheduler | 事務調度,事務調度默認是關閉狀態,可以臨時打開,命令:SET GLOBAL event_scheduler=1; |
skip_external_locking | 外部鎖,也即操作系統實施的鎖,僅 MyISAM引擎有效,且容易造成死鎖發生,所以一律禁用 |
innodb_adaptive_hash_index | InnoDB 引擎會根據數據的訪問頻繁度,把表的數據逐漸緩到內存,若是一張表的數據大量緩存在內存中,則使用Hash Index(散列索引)會更高效。InnoDB 內有Hash Index機制,監控數據的訪問情況,可以自動創建和維護一個Hash Index,以提高訪問效率,減少內存的使用。 |
innodb_max_dirty_pages_pct | InnoDB 主線程會直接更新 innodb_buffer_pool_size中存在的數據,並且不會實時刷回到磁盤,而是等待相關的事件發生,許緩存空間的數據量不實時刷回磁盤的最大百分比。比例設置較小,有利於 減少 mysqld服務出現問題的時候恢復時間,缺點則是需要更多的物理IO,所以,需要根據業務特點和可承受範圍內進行一個折中。 |
參考文檔:
MySQL中文官網:【MySQL 性能調優和優化資源】
好了,關於 MySQL 性能優化實戰,MySQL 性能調優和系統資源優化解決方案(二) 就寫到這兒了,如果還有什麼疑問或遇到什麼問題歡迎掃碼提問,也可以給我留言哦,我會一一詳細的解答的。
歇後語:“ 共同學習,共同進步 ”,也希望大家多多關注CSND的IT社區。
作 者: | 華 仔 |
聯繫作者: | [email protected] |
來 源: | CSDN (Chinese Software Developer Network) |
原 文: | https://blog.csdn.net/Hello_World_QWP/article/details/105731579 |
版權聲明: | 本文爲博主原創文章,請在轉載時務必註明博文出處! |