長期使用 MySQL 經驗表明,嚴重性能問題通常源於以下四類原因:
# Linux 環境
/usr/local/mysql/bin/mysql -h localhost -u root -p
# 無密碼時可省略 -p 參數
mysql> SHOW FULL PROCESSLIST;
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+-----------------------+
| 15 | root | 10.0.1.5 | test | Query | 120 | Sending data | SELECT * FROM big_table... |
+----+------+-----------+------+---------+------+-------+-----------------------+
關鍵觀察指標:
「在我的緩存後端,大部分時間看不到任何 SQL 語句,這才算比較正常。如果看到很多 SQL 語句在執行,那麼這台 MySQL 就一定會有性能問題。」
EXPLAIN 分析查詢執行計劃OPTIMIZE TABLE-- 悲觀:子查詢
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);
-- 樂觀:JOIN 替代
SELECT u.* FROM users u JOIN orders o ON u.id = o.user_id;
-- 悲觀:SELECT *
SELECT * FROM products WHERE category_id = 5;
-- 樂觀:只查需要的列
SELECT id, name, price FROM products WHERE category_id = 5;
[mysqld]
# InnoDB 核心配置
innodb_buffer_pool_size = 4G # 內存的 60-80%
innodb_log_file_size = 512M # 減少检查点压力
innodb_flush_log_at_trx_commit = 2 # 平衡性能與安全
innodb_file_per_table = 1 # 獨立表空間
# 連接與緩存
max_connections = 1000
query_cache_type = 0 # 8.0 已移除,建議關閉
thread_cache_size = 100
# 臨時表優化
tmp_table_size = 256M
max_heap_table_size = 256M
long_query_time = 1,定期分析