1. 程式人生 > 實用技巧 >MySQL調優2

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的索引資訊