主頁 > 後端開發 > SHOW PROFILE分析SQL陳述句性能開銷

SHOW PROFILE分析SQL陳述句性能開銷

2020-11-08 20:41:11 後端開發

前言

在專案中,我們用的sql陳述句,無非就是CRUD,小老犇統計了數百臺資料庫服務器(胡說八道),得出結論,它們百分之八十的性能用在了查詢上,修改,新增,洗掉三個模塊共同占了百分之二十,
所以,我們對SQL的優化,基本體現在select上,

步驟一:舉例說明SQL時間概念

在這里我舉幾個例子來說明,讓大家對sql執行時間有一個簡單的概念,
場景:
我現在有兩張表,一張表有5000條資料,另一張表有50000條資料,
audit_legal :5000條資料,
resource:50000條資料,

案例一:查詢1000條資料,兩張表速度一樣嗎,

在這里插入圖片描述
在這里插入圖片描述
一個用了21ms,一個用了243ms,得出結果,
就算查詢同樣的資料,如果基數不一樣,那么查詢耗時不同,
原因如下:
在沒有索引的情況下,我們執行一條sql陳述句,表是進行全域遍歷,磁盤尋址,就算邏輯上相鄰的記錄在磁盤上也并不一定是物理相鄰的,基數越大,查詢時間也就越長,

專案中訪問介面的請求回應時間一般在200ms以內,高于200ms的介面,嘿嘿,要求不高就沒問題,
注意一點:
直接在MySQL可視化界面執行sql的時間要遠大于訪問這個介面獲得回應的時間,因為子彈要飛一會,

案例二:增加索引,查詢效率提升有多少倍,
在resource這張表進行測驗,
分兩次:
1、通過主鍵進行查詢,

在這里插入圖片描述
在這里插入圖片描述

2、通過普通欄位進行查詢,

在這里插入圖片描述
用一張表,同一條資料:
在這里插入圖片描述
一個幾乎不耗時,0.00025s,另一個用了1.378s,所以索引很牛逼,如果有人問你,增加索引,查詢效率提升有多少倍,那他一定是個錘子,不同基數,查詢效率倍數不一樣,
再問一個問題,MySQL資料庫單表資料量為多少時,效率基本就達到了極限,
一千萬條資料量,答案在這里:
https://blog.csdn.net/numbbe/article/details/109300087

步驟二:開啟資料庫分析功能

開啟之前,先介紹一個英文單詞:profiling
它的中文是分析,接下來會一直用到它,
輸入命令列:
SHOW VARIABLES LIKE ‘%pro%’;
在這里插入圖片描述
我們看到了兩個引數:
profiling:
確定分析陳述句功能是否開啟,mysql默認off/0關閉,on/1為開啟,
開啟后,之后執行的SQL,mysql服務器則會記錄該條sql的系統開銷,比如cpu,io,記憶體消耗等,
profiling_history_size:
保留分析profiling數量,范圍為0-100,為0時,即關閉該功能,

步驟三:MySQL教你怎么玩profiling

我說的肯定沒有mysql教的專業,所以我們看MySQL怎么說,
輸入命令列:
HELP PROFILE;
在這里插入圖片描述

我將mysql的example,拷貝到這里,
哇,好長啊,別看了,往下翻,我把尿文翻譯一下,

NAME	description	EXAMPLE
SHOW PROFILE	Syntax:
SHOW PROFILE [TYPE [, TYPE] ... ]
    [FOR QUERY n]
    [LIMIT ROW_COUNT [OFFSET OFFSET]]

TYPE: {
    ALL
  | BLOCK IO
  | CONTEXT SWITCHES
  | CPU
  | IPC
  | MEMORY
  | PAGE FAULTS
  | SOURCE
  | SWAPS
}

The SHOW PROFILE AND SHOW PROFILES statements display profiling
information that indicates resource USAGE FOR statements executed
during the course of the current session.

*Note*:

The SHOW PROFILE AND SHOW PROFILES statements are deprecated AND will
be removed IN a future MySQL release. USE the Performance SCHEMA
instead; see
https://dev.mysql.com/doc/refman/5.7/en/performance-SCHEMA-QUERY-profil
ing.html.

TO control profiling, USE the profiling SESSION variable, which has a
DEFAULT VALUE of 0 (OFF). ENABLE profiling BY setting profiling TO 1 OR
ON:

mysql> SET profiling = 1;

SHOW PROFILES displays a LIST of the most recent statements sent TO the
server. The size of the LIST IS controlled BY the
profiling_history_size SESSION variable, which has a DEFAULT VALUE of
15. The maximum VALUE IS 100. Setting the VALUE TO 0 has the practical
effect of disabling profiling.

ALL statements are profiled except SHOW PROFILE AND SHOW PROFILES, so
you will find neither of those statements IN the PROFILE list.
Malformed statements are profiled. FOR EXAMPLE, SHOW PROFILING IS an
illegal statement, AND a syntax error occurs IF you try TO EXECUTE it,
but it will SHOW up IN the profiling list.

SHOW PROFILE displays detailed information about a single statement.
Without the FOR QUERY n clause, the output pertains TO the most
recently executed statement. IF FOR QUERY n IS included, SHOW PROFILE
displays information FOR statement n. The VALUES of n correspond TO the
Query_ID VALUES displayed BY SHOW PROFILES.

The LIMIT ROW_COUNT clause may be given TO LIMIT the output TO
ROW_COUNT rows. IF LIMIT IS given, OFFSET OFFSET may be added TO BEGIN
the output OFFSET ROWS INTO the FULL SET of rows.

BY DEFAULT, SHOW PROFILE displays STATUS AND Duration columns. The
STATUS VALUES are LIKE the State VALUES displayed BY SHOW PROCESSLIST,
although there might be SOME minor differences IN interpretion FOR the
two statements FOR SOME STATUS VALUES (see
https://dev.mysql.com/doc/refman/5.7/en/thread-information.html).

Optional TYPE VALUES may be specified TO display SPECIFIC additional
TYPES of information:

o ALL displays ALL information

o BLOCK IO displays counts FOR block input AND output operations

o CONTEXT SWITCHES displays counts FOR voluntary AND involuntary
  context switches

o CPU displays USER AND system CPU USAGE times

o IPC displays counts FOR messages sent AND received

o MEMORY IS NOT currently implemented

o PAGE FAULTS displays counts FOR major AND minor page faults

o SOURCE displays the NAMES of functions FROM the source CODE, together
  WITH the NAME AND line number of the FILE IN which the FUNCTION
  occurs

o SWAPS displays swap counts

Profiling IS enabled per session. WHEN a SESSION ENDS, its profiling
information IS lost.

URL: https://dev.mysql.com/doc/refman/5.7/en/SHOW-profile.html

	mysql> SELECT @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 |
+-------------+
1 ROW IN SET (0.00 sec)

mysql> SET profiling = 1;
QUERY OK, 0 ROWS affected (0.00 sec)

mysql> DROP TABLE IF EXISTS t1;
QUERY OK, 0 ROWS affected, 1 warning (0.00 sec)

mysql> CREATE TABLE T1 (id INT);
QUERY OK, 0 ROWS affected (0.01 sec)

mysql> SHOW PROFILES;
+----------+----------+--------------------------+
| Query_ID | Duration | QUERY                    |
+----------+----------+--------------------------+
|        0 | 0.000088 | SET PROFILING = 1        |
|        1 | 0.000136 | DROP TABLE IF EXISTS t1  |
|        2 | 0.011947 | CREATE TABLE t1 (id INT) |
+----------+----------+--------------------------+
3 ROWS IN SET (0.00 sec)

mysql> SHOW PROFILE;
+----------------------+----------+
| STATUS               | Duration |
+----------------------+----------+
| checking permissions | 0.000040 |
| creating TABLE       | 0.000056 |
| AFTER CREATE         | 0.011363 |
| QUERY END            | 0.000375 |
| freeing items        | 0.000089 |
| logging slow QUERY   | 0.000019 |
| cleaning up          | 0.000005 |
+----------------------+----------+
7 ROWS IN SET (0.00 sec)

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------+----------+
| STATUS             | Duration |
+--------------------+----------+
| QUERY END          | 0.000107 |
| freeing items      | 0.000008 |
| logging slow QUERY | 0.000015 |
| cleaning up        | 0.000006 |
+--------------------+----------+
4 ROWS IN SET (0.00 sec)

mysql> SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| STATUS               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| checking permissions | 0.000040 | 0.000038 |   0.000002 |
| creating TABLE       | 0.000056 | 0.000028 |   0.000028 |
| AFTER CREATE         | 0.011363 | 0.000217 |   0.001571 |
| QUERY END            | 0.000375 | 0.000013 |   0.000028 |
| freeing items        | 0.000089 | 0.000010 |   0.000014 |
| logging slow QUERY   | 0.000019 | 0.000009 |   0.000010 |
| cleaning up          | 0.000005 | 0.000003 |   0.000002 |
+----------------------+----------+----------+------------+
7 ROWS IN SET (0.00 sec)

這里講了如何使用profile命令,介紹了它的語法,介紹了它的引數,

SHOW PROFILE	Syntax:

語法
SHOW PROFILE [TYPE [, TYPE] ... ]	type是下面的type
    [FOR QUERY n]					這里的n是sql陳述句代號,
    [LIMIT ROW_COUNT [OFFSET OFFSET]]

引數
TYPE: {
    ALL					展示所有的開銷資訊,
  | BLOCK IO			IO開銷,
  | CONTEXT SWITCHES	背景關系開銷,
  | CPU					CPU開銷,
  | IPC					發送和接受開銷,
  | MEMORY				記憶體開銷,
  | PAGE FAULTS			頁面錯誤開銷,
  | SOURCE				source開銷,
  | SWAPS				交換次數開銷,
}

舉例說明:
SHOW PROFILE CPU FOR QUERY 2;	查詢2SQL的CPU開銷情況,
下面是一段英譯中,用CSDN翻譯的(在CSDN里不給某翻譯打廣告),有能力的同學可以看上邊的英文,
博主建議大家,將這段中文拷貝到自己的notepad++之類檔案打開,這里看著實在不順眼,太小了,
這段話最好還是看一看,不要因為我說是翻譯的就不看,
里邊不僅僅是翻譯,有我自己的話在其中,有很多知識,
一共十一句話,


1SHOW PROFILE和SHOW PROFILES陳述句根據組態檔顯示陳述句在本次session期間執行的資源使用情況的資訊,

2SHOW PROFILE和SHOW PROFILES陳述句已棄用并將在未來的MySQL版本中洗掉,使用Performance Schema替代,
# 納尼,以后就沒profile這個東西了,大家散了吧,

3、要控制分析,請使用分析會話變數,該變數具有默認值為0(關閉),通過將分析設定為1或啟用分析on4SHOW PROFILES顯示發送到的最新陳述句的串列,服務器串列的大小由profile_history_size會話變數決定,默認值為15最大值為100,將值設定為0具有禁用分析的效果,

5、除SHOW PROFILE和SHOW PROFILES外,所有陳述句都將被分析,因此您在概要檔案串列中找不到這些陳述句,

6、profile格式錯誤的陳述句,例如,SHOW PROFILING是一個非法陳述句,如果試圖執行該陳述句,則會出現語法錯誤,但它會出現在分析串列中,

7show profile陳述句顯示有關單個陳述句的詳細資訊,如果沒有for query n子句,則輸出屬于最近執行的陳述句,如果包含FOR QUERY n,則顯示PROFILE,顯示陳述句n的資訊,n的值對應于查詢SHOW PROFILES顯示的ID值,

8、可以使用LIMIT ROW_COUNT子句將輸出限制為數行,如果給定了限制,則可以在開始處添加偏移偏移量,將輸出偏移行放入完整的行集合中,

9、默認情況下,show profile顯示狀態和持續時間列,即兩個欄位,狀態值類似于SHOW PROCESSLIST顯示的狀態值,可以指定可選型別值來顯示特定的附加值的資訊型別,

10show profile陳述句引數型別解釋,和上邊的九個引數一一對應.
ALL						全部顯示所有資訊

BLOCK IO				塊IO顯示塊輸入和輸出操作的計數

CONTEXT SWITCHES		背景關系切換

CPU						CPU顯示用戶和系統CPU使用時間

IPC						IPC顯示發送和接收的訊息計數

MEMORY					當前未實作記憶體

PAGE FAULTS				頁面錯誤顯示主要和次要頁面錯誤的計數

SOURCE					SOURCE顯示源代碼中函式的名稱或者函式所在檔案的名稱和行號

SWAPS					交換顯示交換計數

11、為每個會話啟用分析,會話結束時,其分析資訊將丟失,


步驟四:決議MySQL的教學example,

執行命令列,開啟sql分析功能:
SHOW VARIABLES LIKE ‘%pro%’;

SET profiling = 1;

SELECT @@profiling; 用來查看是否開啟

在這里插入圖片描述

執行命令:
SELECT COUNT(*) FROM laoben;
SHOW PROFILES;
可以看出上方select命令的query_id為5,消耗時間為0.00078257s,
在這里插入圖片描述

執行命令:
SHOW PROFILE;
該命令顯示的是上一條sql陳述句的執行情況,默認包括兩個欄位,
status,duration,狀態和持續時間,
在這里插入圖片描述

執行命令:指定欄位,指定query_id,查看cpu,io開銷,
SHOW PROFILE cpu,block io FOR QUERY 11;
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/207055.html

標籤:java

上一篇:《Oracle MySQL編程自學與面試指南》01:入門(Getting Started)

下一篇:狂神老師的MySQL學習筆記

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more