1 數據庫調優維度
- 業務需求:勇敢地對不合理的需求說不
- 系統架構:做架構設計的時候,應充分考慮業務的實際情況,考慮好數據庫的各種選擇(讀寫分離?高可用?實例個數?分庫分表?用什么數據庫?)
- SQL及索引:根據需求編寫良好的SQL,并去創建足夠高效的索引
- 表結構:設計良好的表結構
- 數據庫參數設置:設置合理的數據庫性能參數(join buffer、sort buffer…)
- 系統配置:操作系統提供了各種資源使用策略,設置合理的配置,以便于數據庫充分利用資源(swap應盡可能小 -> swappiness)
- 硬件:SSD or 機械硬盤
2 查詢日志
2.1 所有SQL執行日志
-- 開啟查看所有查詢日志,使用后立即關閉
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log = 'OFF';
-- 查看慢查詢日志路徑
show variables like '%general_log%';
2.2 慢查詢日志
2.2.1 開啟日志
- 方式一:修改配置文件my.cnf,在[mysqld]段落中加入如上參數開啟,需要重啟MySQL
# 開啟慢查詢日志
[mysqld]
slow_query_log = ON
log_output = 'FILE,TABLE'
long_query_time = 2
# 重啟MySQL
service mysqld restart
- 方式二:通過全局變量設置,這種方式無需重啟即可生效,但一旦重啟,配置又會丟失
# 開啟慢查詢日志
set global slow_query_log = 'ON';
# 修改多慢算慢查詢的定義long_query_time,需要切換session才能生效
set global long_query_time = 2;
# 將慢查詢日志同時記錄到文件以及mysql.slow_log表中
set global log_output = 'FILE,TABLE';
2.2.1 查看與分析慢查詢日志
-- 查看TABLE中的記錄
select * from mysql.slow_log;
-- 查看slow FILE文件,查看slow file路徑,然后查看文本文件
show variables like '%slow_query_log_file%';
# 分析慢查詢日志文件工具:mysqldumpslow
mysqldumpslow -s r -t 10 -a /var/lib/mysql/node3-26-slow.log
# 分析慢查詢日志文件工具:pt-query-digest
pt-query-digest mysql-slow-2022-01-07.log > 0107.report
pt-query-digest工具官網
3 SQL性能分析
EXPLAIN
:id越大越先執行,相同的id則上面的先執行,可視化分析可以使用:IDEA:Explain plan,MysqlWorkBench,show warnings; 用于展示分析結果SHOW PROFILE
: 簡單、方便,已廢棄INFORMATION_SCHEMA.PROFILING
: 和SHOW PROFILE本質一樣PERFORMANCE_SCHEMA
: 未來之光,但目前來說使用不夠方便OPTIMIZER_TRACE
:跟蹤優化器做出的各種決策、了解優化器的執行細節、理解SQL的執行過程,進而優化SQL
4 數據庫診斷
-- 查看當前正在運行的進程列表
SHOW FULL PROCESSLIST;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;-- 按照客戶端IP分組,看哪個客戶端的連接數最多
select client_ip, count(client_ip) as client_num from (select substring_index ( host, ':', 1 ) as client_ip from information_schema.processlist) as connect_info group by client_ip order by client_num desc;
-- 查看正在執行的線程,并按time倒排序,看看有沒有執行時間特別長的線程
select * from information_schema.processlist where command != 'sleep' order by Time desc limit 10\G
-- 找出所有執行時間超過5分鐘的線程,拼湊出kill語句,方便后面查殺
select concat ('kill', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc;-- 查看狀態
SHOW STATUS;show global status like '%slow%';
SHOW VARIABLES;SHOW VARIABLES like '%%';
SHOW TABLE STATUS;
SHOW INDEX FROM EMPLOYEES;
SHOW ENGINE INNODB STATUS\G
SHOW MASTER STATUS;
SHOW SLAVE STATUS;