MySQL 性能優化實戰,MySQL 性能調優和系統資源優化解決方案(二)

 

目錄

前言

服務器優化

八、服務器優化

1、優化服務器硬件

2、優化 MySQL的參數

 九、MySQL 中的配置參數詳解

1)、MySQL 的基礎配置參數

2)、MySQL 查詢緩存配置參數

3)、MySQL 中 InnoDB 存儲引擎的配置參數

4)、MySQL 中 MyISAM 存儲引擎的配置參數

5)、MySQL 日誌配置參數

6)、MySQL 連接通信參數配置

7)、MySQL 的Buffer緩衝區參數設置

8)、MySQL 性能優化的其它配置參數

十、MySQL 數據庫運行狀態檢查

1)、常用的狀態監控參數

2)、其它補充參數


前言

在上第一部分文章中《 MySQL 性能優化實戰,MySQL 性能調優和系統資源優化解決方案(一) 》完成了MySQL數據庫的結構優化、性能調優,接下來這部分主講系統資源調優、通過MySQL的系統配置參數實現。

服務器優化

 

八、服務器優化

1、優化服務器硬件

服務器的硬件性能直接決定着 MySQL數據庫的性能,硬件的性能瓶頸,直接決定 MySQL數據庫的運行速度和效率。

 

硬件服務器的優化需要從以下幾個方面考慮:

  1. 配置較大的內存,足夠大的內存,是提高 MySQL數據庫性能的方法之一。內存的 IO比硬盤快的多,可以增加系統的緩衝區容量,使數據在內存停留的時間更長,以減少磁盤的 IO;
  2. 配置高速磁盤,比如 SSD;
  3. 合理分配磁盤 IO,把磁盤 IO分散到多個設備上,以減少資源的競爭,提高並行操作能力;
  4. 配置多核處理器,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語句的性能影響;
2、內部維護成本;
3、命中率及內存使用率;
4、項目/產品的業務類型;

query_cache_type

查詢緩存類型。取值如下:

0 OFF,禁用查詢緩存功能;
1 ON,啓用緩存的功能,緩存所有符合要求的查詢結果集,除SELECT SQL_NO_CACHE ...,以及不符合查詢緩存設置的結果集外;
2 DEMAND,僅僅緩存SELECT SQL_CACHE ...子句的查詢結果集,除不符合查詢緩存設置的結果集外;

query_cache_limit

查詢結果長度的長度限制,小於這個長度的數據才能被緩存

 

3)、MySQL 中 InnoDB 存儲引擎的配置參數

InnoDB 參數較少,內存的管理多由 InnoDB引擎自己負責,主要配置參數爲“innodb_buffer_pool_size”,參數分配的緩衝。

參數名

說明

innodb_buffer_pool_size

新開闢一片內存用於緩存 InnoDB引擎表的數據和索引,一般設置爲機器內存的50%-80%(關鍵參數)
該參數的最大值受限於服務器本身 CPU的架構,支持32位還是支持64位,另外還受限於操作系統32位還是64位;
合理設值 innodb_buffer_pool_size,有利於節約訪問表對象中數據的物理IO。在官方手冊上建議專用的數據庫服務器,考慮設置爲物理內存總量的80%。除了物理服務器的物理內存總量外,還需要考慮整個數據庫中是否只使用 InnoDB引擎、mysqld內部管理佔用的內存、最大線程連接數和臨時表等額外的因素,官方提供的 80%僅作爲一個參考。
在以下四種情況中,需要考慮降低 innodb_buffer_pool_size的設值:
1、出現物理內存的競爭,可能導致操作系統的分頁;
2、InnoDB預分配額外的內存給緩衝區和結構管理,當分配的總內存量超過 innodb_buffer_pool_size值的10%;
3、地址內存空間要求必須爲連續的,在windows系統有一個嚴重問題,DLL需要加載在特定的地址空間內;
4、初始化緩衝區的時間消耗,與緩衝區的大小成正比;

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個事務後,則把二進制日誌文件的數據刷新到磁盤上;
等於0,不主動刷新二進制日誌文件的數據到磁盤上,而是由操作系統來決定;

和 innodb_flush_log_at_trx_commit 配置使用(最佳推薦):
1,1,適合數據安全性要求非常高,而且磁盤IO寫能力足夠支持業務,比如充值消費系統;
1,0,適合數據安全性要求高,磁盤IO寫能力支持業務不富餘,允許備庫落後或無複製;
2,0/2,y(0<y<100),適合數據安全性有要求,允許丟失一點事務日誌,複製架構的延遲也能接受;
0,0,磁盤IO寫能力有限,無複製或允許複製延遲稍微長點能接受;
注:x,y,x表示innodb_flush_log_at_trx_commit,y表示sync_binlog

innodb_file_per_table 啓用單表空間,減少共享表空間維護成本,減少空閒磁盤空間釋放的壓力。另外,在數據量較大情況下的性能也會有提升,爲此,一般建議使用獨立表空間代替共享表空間的方式。
innodb_commit_concurrency

同一時刻,允許多少個線程同時提交InnoDB事務,默認值爲0,範圍0-1000。取值定義:

0,允許任意數量的事務在同一時間點提交;
大於0,允許指定個數事務在同一時間點提交;

innodb_concurrency_tickets 同一時刻,能訪問 InnoDB引擎數據的線程數,默認值爲500,取值範圍1-4294967295。如果,當訪問 InnoDB引擎數據的線程數達到設值的上線,線程將會被放到隊列中,等待其他線程釋放 tickets後再進入,一般情況下保持默認即可夠用了。
innodb_fast_shutdown

InnoDB引擎關閉的方式,默認值爲:1,表示正常關閉的,取值:

0,mysqld服務關閉前,先進行數據完全的清理和插入緩衝區的合併操作,若是髒數據較多或者服務器性能等因素,會導致此過程需要數分鐘或者更長時間;
1,正常關閉mysqld服務,當 InnoDB引擎不做任何其他的操作;
2,若是 mysqld出現崩潰,立即刷事務日誌到磁盤上並且冷關閉mysqld服務;沒有提交的事務將會丟失,但是當再啓動 mysqld服務的時候會進行事務回滾恢復;
 

innodb_force_recovery

mysqld服務出現崩潰之後,InnoDB引擎進行回滾的模式,默認值爲0。只有在需要從錯誤狀態的數據庫進行數據備份時,纔會設值 innodb_force_recovery,若是把此參數作爲安全選項,也可以把參數的值設置大於0,防止 InnoDB引擎的數據變更,取值:
0,正常的關閉和啓動,不會做任何強迫恢復操作;
1,跳過錯誤項目,讓 mysqld服務繼續運行。跳過錯誤索引記錄和存儲,嘗試通過SELECT * INOT OUTFILE ‘../filename’ FROM tablename 方式,完成數據備份;
2,阻止 InnoDB的主線程運行。清理操作時出現 mysqld服務崩潰,則會阻止數據恢復操作;
3,恢復的時候,不進行事務回滾;
4,阻止 INSERT緩衝區的合併操作。不做合併操作,爲防止出現 mysqld服務崩潰。不計算表的統計信息;
5,mysqld 服務啓動的時候不檢查回滾日誌,InnoDB引擎對待每個不確定的事務就像提交的事務一樣;
6,不做事務日誌前滾恢復操作;

 

推薦組合配置:
innodb_fast_shutdown = 1
mysqld服務關閉前,先進行數據完全的清理和插入緩衝區的合併操作,若是髒數據較多或者服務器性能等因素,會導致此過程需要數分鐘或者更長時間,若是機房條件較好可設置爲0(例如:雙路電源、UPS、RAID卡電池和供電系統穩定性)
innodb_force_recovery = 0
正常的關閉和啓動,不會做任何強迫恢復操作

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),組合配置推薦:
1、只讀爲主的業務應用場景
transaction-isolation =  read-committed
binlog-format  = mixed
2、非只讀的業務應用場景
transaction-isolation = repeatabled-read
binlog-format  = 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
版權聲明: 本文爲博主原創文章,請在轉載時務必註明博文出處!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章