MySQL性能優化需從硬件層、配置層、查詢層、存儲層四方面協同發力,形成閉環優化體系。
free -h
命令監控)。mode=4
為802.3ad模式)。/etc/sysctl.conf
文件,優化TCP連接和文件描述符限制:# 增加TCP連接隊列長度
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
# 允許更多并發連接
net.core.somaxconn = 4096
# 增加系統最大文件描述符數
fs.file-max = 65535
執行sysctl -p
使配置生效。/etc/security/limits.conf
,增加MySQL用戶的文件描述符限制:mysql soft nofile 65535
mysql hard nofile 65535
MySQL配置文件路徑為/etc/mysql/mysql.conf.d/mysqld.cnf
,需根據硬件規格和業務場景調整核心參數:
innodb_buffer_pool_size = 20G
。innodb_log_buffer_size = 128M
。tmp_table_size = 64M
,max_heap_table_size = 64M
。0
:每秒刷盤一次,性能最高但風險最高(崩潰可能丟失1秒數據,適合非核心業務);1
(默認):事務提交時立即刷盤,最安全但性能最低(適合金融等強一致性場景);2
:事務提交時寫入OS緩存,每秒由OS刷盤,崩潰時可能丟失1秒數據(適合一般業務)。O_DIRECT
(避免雙重緩存)。max_connections = 500
。wait_timeout = 28800
,interactive_timeout = 28800
。通過EXPLAIN
命令查看查詢執行計劃,識別性能瓶頸(如全表掃描、未使用索引):
EXPLAIN SELECT * FROM users WHERE username = 'admin';
重點關注:
type
:訪問類型(ALL
為全表掃描,需優化);key
:使用的索引(若為NULL
,需添加索引);rows
:預估掃描行數(越小越好)。WHERE
、JOIN
、ORDER BY
的列創建索引(如username
、order_id
);避免過度索引(每個索引會增加寫操作開銷)。CREATE INDEX idx_username ON users(username);
SELECT username FROM users WHERE username = 'admin'
,username
字段有索引)。WHERE YEAR(create_time) = 2025
),不使用OR
連接未索引的列。SELECT id, username FROM users
)。SELECT u.username FROM users u JOIN orders o ON u.id = o.user_id
)。SELECT * FROM products LIMIT 10
)。WHERE DATE(create_time) = '2025-09-27'
,會導致索引失效。long_query_time = 2
),用于定位慢查詢。[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
重啟MySQL使配置生效:sudo systemctl restart mysql
。OPTIMIZE TABLE
命令整理表空間,減少碎片(適用于頻繁更新的表)。OPTIMIZE TABLE users;
ANALYZE TABLE
命令更新表的統計信息,幫助優化器選擇更好的執行計劃。ANALYZE TABLE orders;
注意:所有優化操作前需備份數據庫(如mysqldump -u root -p dbname > backup.sql
),并在測試環境中驗證效果,避免影響生產環境。