SQL優化之show profiles

注意:使用數據庫可視化工具Navicat查詢出來的參數居然跟直接xshell查出來的參數不同,Navicat的版本是 11.2.7-premium,因此修改參數仍是在命令行修改,比較準確。 show profiles命令是在MySQL5.0之後才新加入的,是一個語句分析的利器。

如何使用

首先查看是否支持該功能。sql

show variables like 'have_profiling';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| have_profiling | YES   |
+----------------+-------+

默認是關閉的,開啓該功能。shell

set profiling=on;

查看開啓狀態。15表示歷史緩存sql的個數。數據庫

show variables like 'profiling%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| profiling              | ON    |
| profiling_history_size | 15    |
+------------------------+-------+

接下來隨便運行幾條sql,並使用 show profiles 命令,將展現剛纔運行的SQL語句。參數很好理解,不作解釋了。緩存

+----------+------------+----------------------------------+
| Query_ID | Duration   | Query                            |
+----------+------------+----------------------------------+
|        1 | 0.00106200 | show variables like 'profiling%' |
|        2 | 0.00044400 | select * from t_logs             |
|        3 | 0.00019350 | select * from t_commonts         |
|        4 | 0.00043725 | select * from t_comments         |
+----------+------------+----------------------------------+

下面分析指定的SQL語句,使用以下命令(4是上面查出來的Query_ID,cpu和block io表明cpu的處理時間和io的時間):網絡

若是cpu時間慢,表示cpu的佔用率比較高,io慢的話,表示內存佔用率比較高。工具

show profile cpu,block io for query 4;
+----------------------+----------+----------+------------+--------------+---------------+
| Status               | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+----------------------+----------+----------+------------+--------------+---------------+
| starting             | 0.000072 | 0.000032 |   0.000033 |            0 |             0 |
| checking permissions | 0.000008 | 0.000003 |   0.000004 |            0 |             0 |
| Opening tables       | 0.000022 | 0.000011 |   0.000011 |            0 |             0 |
| init                 | 0.000038 | 0.000038 |   0.000000 |            0 |             0 |
| System lock          | 0.000009 | 0.000009 |   0.000000 |            0 |             0 |
| optimizing           | 0.000005 | 0.000005 |   0.000000 |            0 |             0 |
| statistics           | 0.000014 | 0.000014 |   0.000000 |            0 |             0 |
| preparing            | 0.000011 | 0.000010 |   0.000000 |            0 |             0 |
| executing            | 0.000003 | 0.000003 |   0.000000 |            0 |             0 |
| Sending data         | 0.000209 | 0.000209 |   0.000000 |            0 |             0 |
| end                  | 0.000004 | 0.000004 |   0.000000 |            0 |             0 |
| query end            | 0.000007 | 0.000006 |   0.000000 |            0 |             0 |
| closing tables       | 0.000009 | 0.000009 |   0.000000 |            0 |             0 |
| freeing items        | 0.000017 | 0.000017 |   0.000000 |            0 |             0 |
| cleaning up          | 0.000011 | 0.000011 |   0.000000 |            0 |             0 |
+----------------------+----------+----------+------------+--------------+---------------+

其中cpu和block io兩個參數比較重要,還有其餘參數,以下:性能

type desc
ALL 顯示全部的開銷信息
BLOCK IO 顯示與IO相關的開銷
CONTEXT SWITCHES 上下文切換相關開銷
CPU 與CPU相關的開銷
IPC 顯示發送和接受相關的開銷信息
MEMORY 顯示內存相關的開銷信息
PAGE FAULTS 顯示頁面錯誤相關開銷信息
SOURCE 顯示和Source_function,SOURCE_file,SOURCE_line 相關的開銷信息
SWAPS 顯示交換次數相關的開銷信息

參數的分析

在show profile 的時候有一個字段叫status,幾個重要的參數以下:命令行

狀態 描述
System lock 確認是因爲哪一個鎖引發的,一般是由於MySQL或InnoDB內核級
的鎖引發的建議:若是耗時較大再關注便可,通常狀況下都還好
Sending data 從server端發送數據到客戶端,也有多是接收存儲引擎層返回的數據
再發送給客戶端,數據量很大時尤爲常常能看見,
備註:Sending Data不是網絡發送,是從硬盤讀取,發送到網絡是
Writing to net。建議:經過索引或加上LIMIT,減小須要掃描而且發送
給客戶端的數據量
Sorting result 正在對結果進行排序,相似Creating sort index,不過是正常表,
而不是在內存表中進行排序建議:建立適當的索引
Table lock 表級鎖,沒什麼好說的,要麼是由於MyISAM引擎表級鎖,
要麼是其餘狀況顯式鎖表
create sort index 當前的SELECT中須要用到臨時表在進行ORDER BY排序。
建議:建立適當的索引
checking query cache for
querychecking privileges on
cachedsending cached result to
clienstoring result in query cache
和query cache相關的狀態,已經屢次強烈建議關閉

除了上述幾個字段,若是Status出現了以下幾個字段,說明SQL性能問題很嚴重。code

  • converting HEAP to MyISAM :查詢結果太大,內存不夠用,往磁盤上存儲了。
  • Creating tmp table:建立臨時表,首先拷貝原有數據到臨時表,用完後再刪除臨時表,在數據量很大的狀況下,異常的耗性能。
  • Copying to tmp table on disk:把內存中的臨時表複製到磁盤,也至關的耗費性能。
  • locked:鎖表了。
相關文章
相關標籤/搜索