MySQL性能分析(Explain)

来源:https://www.cnblogs.com/lvguang/archive/2020/05/26/12965165.html
-Advertisement-
Play Games

更多知識,請移步我的小破站:http://hellofriend.top 1. 概述 使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸。 通過Explain,我們可以獲取以下信息: 表的讀取順序 哪些索引可以 ...


更多知識,請移步我的小破站:http://hellofriend.top

1. 概述

使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸。

通過Explain,我們可以獲取以下信息:

  • 表的讀取順序
  • 哪些索引可以使用
  • 數據讀取操作的操作類型
  • 哪些索引被實際使用
  • 表之間的引用
  • 每張表有多少行被物理查詢

2. 怎樣獲取SQL語句的執行計劃?

Explain + SQL語句

舉例

EXPLAIN SELECT * FROM USER;

在這裡插入圖片描述

執行計劃所包含的信息

在這裡插入圖片描述

3. 執行計劃各個名詞欄位的解釋

3.1 Id

select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序。

三種情況

(1) ID相同

id相同,執行順序由上至下。
在這裡插入圖片描述

(2)ID不同

如果是子查詢,id的序號會遞增。id越大優先順序越高,越先被執行。
在這裡插入圖片描述

(3)ID既有相同的也有不同的

id如果相同,可以認為是一組,從上往下順序執行。在所有組中,id值越大,優先順序越高,越先執行。
在這裡插入圖片描述

註意點

id號每個號碼,表示一趟獨立的查詢。一個sql的查詢趟數越少越好。

3.2 Select_type

查詢的類型,主要是用於區別普通查詢、聯合查詢、子查詢等的複雜查詢。
在這裡插入圖片描述

  • Simple:簡單的 select 查詢,查詢中不包含子查詢或者UNION。
    在這裡插入圖片描述
  • Primary:查詢中若包含任何複雜的子部分,最外層查詢則被標記為Primary。
    在這裡插入圖片描述
  • Derived:在FROM列表中包含的子查詢被標記為DERIVED(衍生),MySQL會遞歸執行這些子查詢, 把結果放在臨時表裡。
    在這裡插入圖片描述
  • SubQuery:在SELECT或WHERE列表中包含了子查詢。
    在這裡插入圖片描述
  • Dependent SubQuery:在SELECT或WHERE列表中包含了子查詢,用到了IN關鍵字的。
    在這裡插入圖片描述
  • Uncacheable SubQuery:不可以使用到緩存的子查詢,用到了變數作為篩選條件。
    在這裡插入圖片描述
  • Union:若第二個SELECT出現在UNION之後,則被標記為UNION;若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED。

在這裡插入圖片描述

  • Union Result:從UNION表獲取結果的SELECT。
    在這裡插入圖片描述

3.3 Table

顯示這一行的數據是關於哪張表的。

3.4 Partitions

代表分區表中的命中情況,非分區表,該項為null。

3.5 Type

type顯示的是訪問類型,是較為重要的一個指標,結果值從最好到最壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL 

一般來說,得保證查詢至少達到range級別,最好能達到ref

顯示查詢使用了何種類型,從最好到最差依次是:

system > const > eq_ref > ref > range > index > ALL

總覽

在這裡插入圖片描述

三種需要優化的類型

Range

只檢索給定範圍的行,使用一個索引來選擇行。key 列顯示使用了哪個索引。一般就是在你的where語句中出現了between、<、>、in等的查詢。

這種範圍掃描索引掃描比全表掃描要好,因為它只需要開始於索引的某一點,而結束語另一點,不用掃描全部索引。
在這裡插入圖片描述
在這裡插入圖片描述

Index

SQL使用到了索引,但是沒用索引進行過濾。一般是使用到了覆蓋索引或者是使用索引進行排序分組。
在這裡插入圖片描述

All

Full Table Scan,將遍歷全表以找到匹配的行。
在這裡插入圖片描述

3.6 Possible_Keys

顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的欄位上若存在索引,則該索引將被列出,但不一定被查詢實際使用。

3.7 Key

實際使用的索引。如果為NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引和查詢的select欄位重疊。

3.8 Key_Len

表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度。key_len欄位能夠幫你檢查是否充分的利用上了索引。key_len越長,查詢效率越高。Where條件命中索引的長度,不包含分組排序。
在這裡插入圖片描述

3.9 Ref

顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用於查找索引列上的值。
在這裡插入圖片描述

3.10 Rows

rows列顯示MySQL認為它執行查詢時必須檢查的行數。行數越少,效率越高!

3.11 Filtered

這個欄位表示存儲引擎返回的數據在server層過濾後,剩下多少滿足查詢的記錄數量的比例,註意是百分比,不是具體記錄數。

3.12 Extra

包含不適合在其他列中顯示但十分重要的額外信息。主要用來檢查分組、排序的時候用沒用到索引。

Using filesort

說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。MySQL中無法利用索引完成的排序操作稱為“ 文件排序 ”。排序的欄位沒有創建索引

Using temporary

使了用臨時表保存中間結果,MySQL在對查詢結果排序時使用臨時表。常見於排序 order by 和分組查詢 group by。分組的時候使用的欄位沒有創建索引,分組其實內部包含了一個排序的過程,所以上面的Using filesort 也會出現。

Using Index

表示相應的select操作中使用了覆蓋索引,避免訪問了表的數據行,效率不錯。

Using Where

表明使用到了Where過濾。

Using Join Buffer

使用到了連接緩存。

Impossible where

where 子句的結果永遠為false,表示sql語句錯了。

Select tables optimized away

在沒有GROUPBY子句的情況下,基於索引優化MIN/MAX操作或者 對於MyISAM存儲引擎優化COUNT(*)操作,不必等到執行階段再進行計算, 查詢執行計劃生成的階段即完成優化。
在這裡插入圖片描述

總結

本文講述了通過使用Explain關鍵字進行MySQL語句性能的分析,下篇將更進一步的講解如何進行優化。

本文由博客群發一文多發等運營工具平臺 OpenWrite 發佈


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

-Advertisement-
Play Games
更多相關文章
  • mkpasswd命令 功能說明:生成隨機密碼 註意:要使用此命令,需要安裝expect軟體包。 用法:mkpasswd [ args ] [ user ] 選項 作用 -l 指定密碼的長度(length),預設是9位 -d 指定密碼中使用多少位的數字(digits),預設為2位 -c 指定密碼中使用 ...
  • last命令 功能說明:顯示最近登錄用戶的列表 last命令會讀取位於/var/log/下的wtmp文件,並把文件中記錄的登錄系統的用戶名顯示出來。 用法:last 選項 作用 -n 設置顯示名單的行數 -R 不顯示登錄的主機名稱和IP地址 示例:顯示最近登錄用戶的信息 root pts/1 192 ...
  • id命令 功能說明:查看指定用戶的ID信息 用法:id [OPTIONS]... [USERNAME] id命令不指定用戶時,則顯示當前用戶的ID。若指定用戶,而不加任何選項時,則顯示用戶ID及所屬組的ID。 選項 作用 -u,--user 僅顯示用戶UID -g,--group 僅顯示用戶的基本組 ...
  • passwd命令 功能說明:設置密碼 用法:passwd [options] [username] 管理員可以使用不帶任何選項的passwd命令修改自己的密碼。 管理員修改任何用戶的密碼都不需要知道用戶原來的密碼,普通用戶僅能更改自己的密碼,且在更改密碼之前,系統會要求用戶輸入現在的密碼,另外普通用 ...
  • 2台主機互為備份,Web服務顯示NFS文件系統上的資源。新增一個Linux6.8的系統作為NFS文件伺服器目錄:1、完成HeartBeat基礎配置2、配置NFS伺服器3、配置HeartBeat資源管理伺服器使用NFS資源4、結果測試1、完成HeartBeat基礎配置基礎配置這裡就不在敘述了,參考下麵... ...
  • 剛纔完成了合同表的變更,到最後一步rename table的時候 ,有個長時間的查詢占用了元數據鎖,導致rename的最後一步不能進行。將該會話kill後rename完成。 ...
  • MySQL的社區版沒有審計功能,企業版才有審計功能。企業版中自帶 Audit Plugin ,名為audit_log.so。但是其它MySQL分支版本也開發了各自的審計功能插件。最常見的就是Percona Audit Log Plugin、MariaDB Audit Plugin、當然還有通用插件M... ...
  • 1.MSC添加shard節點 mkdir -p /mongodb/38027/conf /mongodb/38027/log /mongodb/38027/datamkdir -p /mongodb/38028/conf /mongodb/38028/log /mongodb/38028/datam ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...