MySQL調優2
在如何調優SQL的基礎上,繼續學習MySQL調優技術。
MySQL調優的維度
在三角形的底部,成本越低。如業務需求。
2、測試資料準備
下載https://github.com/datacharmer/test_db 測試資料
cd/home/files/test_db-master
執行mysql -uroot -pxxx < employees.sql
檢查匯入是否正常
mysql -uroot -pxxx -t < test_employees_md5.sql
[root@VM_0_13_centos test_db-master]# mysql -uroot -pxxx -t < test_employees_md5.sql mysql: [Warning] Using a password on the command line interface can be insecure. +----------------------+ | INFO | +----------------------+ | TESTING INSTALLATION | +----------------------+ +--------------+------------------+----------------------------------+ | table_name | expected_records | expected_crc | +--------------+------------------+----------------------------------+ | departments | 9 | d1af5e170d2d1591d776d5638d71fc5f | | dept_emp | 331603 | ccf6fe516f990bdaa49713fc478701b7 | | dept_manager | 24 | 8720e2f0853ac9096b689c14664f847e | | employees | 300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 | | salaries | 2844047 | fd220654e95aea1b169624ffe3fca934 | | titles | 443308 | bfa016c472df68e70a03facafa1bc0a8 | +--------------+------------------+----------------------------------+ +--------------+------------------+----------------------------------+ | table_name | found_records | found_crc | +--------------+------------------+----------------------------------+ | departments | 9 | d1af5e170d2d1591d776d5638d71fc5f | | dept_emp | 331603 | ccf6fe516f990bdaa49713fc478701b7 | | dept_manager | 24 | 8720e2f0853ac9096b689c14664f847e | | employees | 300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 | | salaries | 2844047 | fd220654e95aea1b169624ffe3fca934 | | titles | 443308 | bfa016c472df68e70a03facafa1bc0a8 | +--------------+------------------+----------------------------------+ +--------------+---------------+-----------+ | table_name | records_match | crc_match | +--------------+---------------+-----------+ | departments | OK | ok | | dept_emp | OK | ok | | dept_manager | OK | ok | | employees | OK | ok | | salaries | OK | ok | | titles | OK | ok | +--------------+---------------+-----------+ +------------------+ | computation_time | +------------------+ | 00:00:38 | +------------------+ +---------+--------+ | summary | result | +---------+--------+ | CRC | OK | | count | OK | +---------+--------+
3、MySQL慢查詢
1) MySQL慢查詢引數
2) MySQL使用方式
方式二
這裡使用第二種方式
set global slow_query_log = 'ON';
set global log_output = 'FILE,TABLE';
set global long_query_time = 0.001; --1毫秒 需要重新連線資料庫
show variables like '%long_query_time%' 檢視是否生效
set global log_queries_not_using_indexes = 'ON';
MySQL慢查詢
select * from employees
select * from `mysql`.slow_log;
可以看到有慢查詢日誌了
rows_sent 表示有多少條資料返回客戶端。
rows_examined: 表示這條SQL掃碼了多少行。
顯示慢查詢檔案所在的路徑
show variables like '%slow_query_log_file%'
路徑為:/var/lib/mysql/VM_0_13_centos-slow.log
檢視慢日誌檔案 moreVM_0_13_centos-slow.log
3、Explian使用
找到慢SQL後,使用Explian查具體慢的原因
Explian結果輸出欄位
例項1
type: ALL 全表掃描,效能最差
key,key_length 為空: 說明沒有執行任何索引。
rows: 掃描行數 2838426
例項2
explain
select * from employees e
left join salaries s on e.emp_no = s.emp_no
where e.emp_no = 10001
結果:
這裡id都是1,從上到下依次執行; 如果id值不同,id值越大,越早執行。
4、Explain視覺化工具
1) IDEA中,選擇SQL語句,右鍵。選擇Explian Plan(Raw)
4、SQL效能分析
SQL內部分析效能包括
SHOWPROFILE
INFORMATION_SCHEMA.PROFILING
PERFORMANCE_SCHEMA (MySQL建議使用)
1) SHOW PROFILE是MySQl的一個性能分析命令,可以跟蹤SQL各種資源消耗
檢視是否支援
SELECT @@have_profiling;
YES說明支援。
檢視是否開啟
select @@profiling;
0說明沒有開啟
開啟profiling
set @@profiling = 1;
預設之後記錄15條的歷史
設定歷史條數為100
set profiling_history_size = 100;
檢視profile
show profiles;
查詢select * from salaries; 後執行show profiles;
可以發現Query_ID 為49.
查詢這條SQL的執行過程show profile for query 49;
可以發現這個步驟執行時間最久。 Sending data 0.000745
查詢這條SQL記憶體執行資訊
show profile memory for query 49;
查詢各種各樣的資訊
show profile ALL for query 49;
分析完成之後,關閉profiling
set @@profiling = 0;
MySQL官方文件宣告SHOW PROFILE已被廢棄,並建議使用Performance Schema作為替代。
2)INFORMATION_SCHEMA.PROFILING
開啟profiling
set @@profiling = 1;
執行SQL
select * from salaries;
檢視Query_ID為125show profiles;
顯示profile
select STATE, format(DURATION,6) AS DURATION FROM information_schema.PROFILING WHERE QUERY_ID = 125 ORDER BY SEQ
顯示結果如下:
3)PERFORMANCE_SCHEMA
檢視是否開啟
select * from performance_schema.setup_actors;
預設是開啟的。任意主機發過來的請求,任意使用者,任意角色都開啟了。
只監控指定使用者執行的SQL(實際專案建議使用)
執行如下SQL,開啟監控項
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE '%statement/%'; UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE '%stage/%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%events_statements_%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%events_stages_%';
使用開啟監控的使用者,執行SQL語句,比如:
SELECT * FROM salaries
執行如下SQL,獲得語句EVENT_ID
select EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000, 6) AS DURATION, SQL_TEXT FROM performance_schema.events_statements_history_long where SQL_TEXT LIKE '%salaries%'
結果如下圖:
分析執行的SQL語句
select event_name as Stage, TRUNCATE(TIMER_WAIT/1000000000000, 6) AS DURATION FROM performance_schema.events_statements_history_long where NESTING_EVENT_ID = 400
4) 三種方式對比
SHOWPROFILE 簡單,方便,已廢棄。
INFORMATION_SCHEMA.PROFILING 和SHOWPROFILE 本質是一樣的 (已廢棄)
PERFORMANCE_SCHEMA (MySQL建議使用) 目前來說使用不夠方便。
如何選擇: 目前可以繼續使用SHOWPROFILE
6、OPTIMIZER_TRACE 優化器跟蹤
跟蹤優化器做出的各種決策
瞭解優化器的執行細節
理解SQL的執行過程,進而優化SQL
開啟optimizer_trace
set optimizer_trace = "enabled=on", end_markers_in_json = on;
記錄最近30條SQL語句
set optimizer_trace_offset = -30, optimizer_trace_limit = 30;
執行需要分析的SQL語句
select *
from salaries
where from_date = '1986-06-26'
and to_date = '1987-06-26'
使用如下語句分析
select * from information_schema.OPTIMIZER_TRACE limit 30
7、SQL診斷命令
如果資料庫出了問題,應該如何定位呢,下面介紹常用的SQL診斷命令
1) 檢視當前正在執行的執行緒
show [FULL] processlist
幾個information_schema表常用的操作
2) 檢視伺服器相關資訊
show status
3) 檢視MySQL的變數
show variables;
4) 查看錶以及檢視的狀態
show table status
5) 檢視索引相關資訊
show INDEX from employees;
查看錶employees的索引資訊