SQL性能分析

来源:https://www.cnblogs.com/wekenyblog/archive/2023/03/05/17181569.html
-Advertisement-
Play Games

1、工作應用場景 統計得到每個小時的UV、PV、IP的個數,構建如下表結構: 但是表中數據的存儲格式不利於直接查詢展示,需要進行調整:(以時間分區,去重、聚合等……對結果進行行列轉換) 2、行轉列 (1)多行轉多列 case when函數 功能:用於實現對數據的判斷,根據條件,不同的情況返回不同的結 ...


SQL執行頻率

MySQL 客戶端連接成功後,通過 show [session|global] status 命令可以提供伺服器狀態信
息。通過如下指令,可以查看當前資料庫的INSERT、UPDATE、DELETE、SELECT的訪問頻次:

-- session 是查看當前會話 ;
-- global 是查詢全局數據 ;
SHOW GLOBAL STATUS LIKE 'Com_______';

 

 

 假如說是以查詢為主,我們又該如何定位針對於那些查詢語句進行優化呢? 此時我們可以藉助於慢查詢日誌。

慢查詢日誌

慢查詢日誌記錄了所有執行時間超過指定參數(long_query_time,單位:秒,預設10秒)的所有
SQL語句的日誌。
MySQL的慢查詢日誌預設沒有開啟,我們可以查看一下系統變數 slow_query_log。

 

 

 若要開啟慢查詢日誌,需要在mysql配置文件(/etc/my.cnf)中配置如下信息:

#開啟MySql慢日誌查詢開關:

slow_query_log=1

#設置慢日誌的時間為2s,SQL語句執行超過2s,就會視為慢查詢,記錄到慢查詢日誌

long_query_time=2

配置完畢之後,通過以下指令重新啟動MySQL:

systemctl restart mysqld

然後,再次查看開關情況,慢查詢日誌就已經打開了。

 

 

 執行命令:cat /var/lib/mysql/localhost-slow.log 或者執行tail -f /var/lib/mysql/localhost-slow.log查看慢查詢日誌信息。

執行如下SQL語句 :select count(*) from tb_user;

檢查慢查詢日誌 :最終我們發現,在慢查詢日誌中,只會記錄執行時間超多我們預設時間(2s)的SQL,執行較快的SQL是不會記錄的。

 

通過慢查詢日誌,就可以定位出執行效率比較低的SQL,從而有針對性的進行優化

 

profile詳情

show profiles 能夠在做SQL優化時幫助我們瞭解時間都耗費到哪裡去了。通過have_profiling
參數,能夠看到當前MySQL是否支持profile操作:SELECT  @@have_profiling ;

 

 

 可以看到,當前MySQL是支持 profile操作的,但是開關是關閉的。可以通過set語句在

session/global級別開啟profiling:

SET profiling = 1;

開關已經打開了,接下來,我們所執行的SQL語句,都會被MySQL記錄,並記錄執行時間消耗到哪兒去
了。 我們直接執行如下的SQL語句:

select * from tb_user;
select * from tb_user where id = 1;
select * from tb_user where name = '白起';
select count(*) from tb_sku;

執行一系列的業務SQL的操作,然後通過如下指令查看指令的執行耗時:

-- 查看每一條SQL的耗時基本情況
show profiles;

-- 查看指定query_id的SQL語句各個階段的耗時情況
show profile for query query_id;

-- 查看指定query_id的SQL語句CPU的使用情況
show profile cpu for query query_id;

查看每一條SQL的耗時情況:

 

 

 查看指定SQL各個階段的耗時情況 :

 

 

 explain

EXPLAIN 或者 DESC命令獲取 MySQL 如何執行 SELECT 語句的信息,包括在 SELECT 語句執行
過程中表如何連接和連接的順序。
語法:

-- 直接在select語句之前加上關鍵字 explain / desc

EXPLAIN SELECT 欄位列表 FROM 表名 WHERE 條件 ;

 

 

 Explain 執行計劃中各個欄位的含義:

id:select查詢的序列號,表示查詢中執行select子句或者是操作表的順序(id相同,執行順序從上到下;id不同,值越大,越先執行)。
select_type:表示 SELECT 的類型,常見的取值有 SIMPLE(簡單表,即不使用表連接或者子查詢)、PRIMARY(主查詢,即外層的查詢)、
              UNION(UNION 中的第二個或者後面的查詢語句)、
              SUBQUERY(SELECT/WHERE之後包含了子查詢)等
type:表示連接類型,性能由好到差的連接類型為NULL、system、const、eq_ref、ref、range、 index、all 。
possible_key: 顯示可能應用在這張表上的索引,一個或多個。
key: 實際使用的索引,如果為NULL,則沒有使用索引。
key_len:表示索引中使用的位元組數, 該值為索引欄位最大可能長度,並非實際使用長度,在不損失精確性的前提下, 長度越短越好 。
rows:MySQL認為必須要執行查詢的行數,在innodb引擎的表中,是一個估計值,可能並不總是準確的。
filtered: 表示返回結果的行數占需讀取行數的百分比, filtered 的值越大越好。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目傳送門 題目描述 我們可以用這樣的方式來表示一個十進位數: 將每個阿拉伯數字乘以一個以該數字所處位置為指數,以 1010 為底數的冪之和的形式。例如 123123 可表示為 1 \times 10^2+2\times 10^1+3\times 10^01×102+2×101+3×100 這樣的形 ...
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。 簡介 現如今,有兩種常見的軟體資源幾乎成了Java後端程式的標配,即線程池與連接池,但這些池化資源非常的重要,一旦不夠用了,就會導致程式阻塞、性能低下,所以有時我們需要看看它們的使用情況,以判斷這裡是否是瓶頸。 ...
  • Spring擴展 1.自定義攔截器 spring mvc攔截器根spring攔截器相比,它裡面能夠獲取HttpServletRequest和HttpServletResponse等web對象實例。 spring mvc攔截器的頂層介面是:HandlerInterceptor,包含三個方法: preH ...
  • 這篇文章主要討論分散式系統中的網路分區問題,網路分區是指在分散式集群中,節點之間由於網路不通,導致集群中的節點形成不同的子集,子集中的節點可以相互通信,子集之間的網路是不通的。 ...
  • 簡介 chatgpt-java是一個OpenAI的Java版SDK,支持開箱即用。目前以支持官網全部Api。支持最新版本GPT-3.5-Turbo模型以及whisper-1模型。增加chat聊天對話以及語音文件轉文字,語音翻譯。 開源地址:https://github.com/Grt1228/cha ...
  • 1、簡介 EFcore,可用使得開發人員不需要再去關註資料庫的實現,全都由代碼進行生成 這樣有利於減少工作量、資料庫快速遷移... 2、上手搭建架構 (這個圖是做完本章內容的完整圖,我們一步步深入即可) 在寫EF之前,先安裝好資料庫,我選擇在本地安裝Sqlserver 我們先執行最核心的兩步,將EF ...
  • 以下代碼的功能是用戶可以實現業務中用戶虛擬錢包的錢提現到用戶銀行卡,其實本質上是把商戶的賬戶資金劃轉到用戶銀行卡,其實就是銀行轉賬,相關代碼如下: ///此方法存在部分業務代碼,核心方法是doProcess方法且基本是可以復用的,其它的代碼可以根據自身業務場景靈活處理;public async Ta ...
  • 前言 記得在360實習的時候,聽到過一句話,大部分的安全問題並不是黑客造成的,而是內部人員。 epbf可以避免代碼侵入,像樁子一樣監控應用,同時也帶來了一些安全問題。 下麵簡單演示一下如何利用bpftrace竊取Mysql的賬號密碼。 步驟 Go程式 這個程式只是利用xorm連接資料庫,然後判斷st ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...