MySQL執行計劃分析

来源:https://www.cnblogs.com/huchong/archive/2019/01/08/10235260.html
-Advertisement-
Play Games

一. 執行計劃能告訴我們什麼? SQL如何使用索引 聯接查詢的執行順序 查詢掃描的數據函數 二. 執行計劃中的內容 SQL執行計劃的輸出可能為多行,每一行代表對一個資料庫對象的操作 1. ID列 ID列中的如果數據為一組數字,表示執行SELECT語句的順序;如果為NULL,則說明這一行數據是由另外兩 ...


一. 執行計劃能告訴我們什麼?

  • SQL如何使用索引
  • 聯接查詢的執行順序
  • 查詢掃描的數據函數

二. 執行計劃中的內容

SQL執行計劃的輸出可能為多行,每一行代表對一個資料庫對象的操作

1. ID列

  • ID列中的如果數據為一組數字,表示執行SELECT語句的順序;如果為NULL,則說明這一行數據是由另外兩個SQL語句進行 UNION操作後產生的結果集
  • ID值相同時,說明SQL執行順序是按照顯示的從上至下執行的
  • ID值不同時,ID值越大代表優先順序越高,則越先被執行

演示

可以看到上面的執行計劃返回了3行結果,id列的值可以看作是SQL中所具有的SELECT操作的序號
由於上述SQL中只有一個SELECT,所以id全為1,因此,我們就要按照由上至下讀取執行計劃
按照我們的SQL語句,我們會認為執行順序是a,b,c,但是通過上圖可以發現,Mysql並不是完成按照SQL中所寫的順序來進行表的關聯操作的
執行對錶的執行順序為a,c,b,這是由於MySQL優化器會根據表中的索引的統計信息來調整表關聯的實際順序

2. SELECT_TYPE列

含義
SIMPLE 不包含子查詢或是UNION操作的查詢
PRIMARY 查詢中如果包含任何子查詢,那麼最外層的查詢則被標記為PRIMARY
SUBQUERY SELECT 列表中的子查詢
DEPENDENT SUBQUERY 依賴外部結果的子查詢
UNION Union操作的第二個或是之後的查詢的值為union
DEPENDENT UNION 當UNION作為子查詢時,第二或是第二個後的查詢的select_type值
UNION RESULT UNION產生的結果集
DERIVED 出現在FROM子句中的子查詢

3. TABLE列

包含以下幾種結果:

輸出去數據行所在表的名稱,如果表取了別名,則顯示的是別名
<union M,N>: 由ID為M,N查詢union產生的結果集
<derived N>/<subquery N> :由ID為N的查詢產生的結果

4. PARTITIONS列:

查詢匹配的記錄來自哪一個分區
對於分區表,顯示查詢的分區ID
對於非分區表,顯示為NULL

5. TYPE列

按性能從高至低排列如下:

含義
system 這是const聯接類型的一個特例,當查詢的表只有一行時使用
const 表中有且只有一個匹配的行時使用,如對主鍵或是唯一索引的查詢,這是效率最高的聯接方式
eq_ref 唯一索引或主鍵索引查詢,對應每個索引鍵,表中只有一條記錄與之匹配
ref 非唯一索引查找,返回匹配某個單獨值的所有行
ref_or_null 類似於ref類型的查詢,但是附加了對NULL值列的查詢
index_merge 該聯接類型表示使用了索引合併優化方法
range 索引範圍掃描,常見於between、>、<這樣的查詢條件
index FULL index Scan 全索引掃描,同ALL的區別是,遍歷的是索引樹
ALL FULL TABLE Scan 全表掃描,這是效率最差的聯接方式

6. Extra列

包含MySQL如何執行查詢的附加信息

含義
Distinct 優化distinct操作,在找到第一個匹配的元素後即停止查找
Not exists 使用not exists來優化查詢
Using filesort 使用額外操作進行排序,通常會出現在order by或group by查詢中
Using index 使用了覆蓋索引進行查詢
Using temporary MySQL需要使用臨時表來處理查詢,常見於排序,子查詢,和分組查詢
Using where 需要在MySQL伺服器層使用WHERE條件來過濾數據
select tables optimized away 直接通過索引來獲得數據,不用訪問表,這種情況通常效率是最高的

7. POSSIBLE_KEYS列

  • 指出MySQL能使用哪些索引來優化查詢
  • 查詢列所涉及到的列上的索引都會被列出,但不一定會被使用

8. KEY列

  • 查詢優化器優化查詢實際所使用的索引
  • 如果表中沒有可用的索引,則顯示為NULL
  • 如果查詢使用了覆蓋索引,則該索引僅出現在Key列中

9. KEY_LEN列

顯示MySQL索引所使用的位元組數,在聯合索引中如果有3列,假如3列欄位總長度為100個位元組,Key_len顯示的可能會小於100位元組,比如30位元組,這就說明在查詢過程中沒有使用到聯合索引的所有列,只是利用到了前面的一列或2列

  • 表示索引欄位的最大可能長度
  • Key_len的長度由欄位定義計算而來,並非數據的實際長度

10. Ref列

  • 表示當前表在利用Key列記錄中的索引進行查詢時所用到的列或常量

11. rows列

  • 表示MySQL通過索引的統計信息,估算出來的所需讀取的行數(關聯查詢時,顯示的是每次嵌套查詢時所需要的行數)
  • Rows值的大小是個統計抽樣結果,並不十分準確

12. Filtered列

  • 表示返回結果的行數占需讀取行數的百分比
  • Filtered列的值越大越好(值越大,表明實際讀取的行數與所需要返回的行數越接近)
  • Filtered列的值依賴統計信息,所以同樣也不是十分準確,只是一個參考值

三. 執行計劃的限制

  • 無法展示存儲過程,觸發器,UDF對查詢的影響
  • 無法使用EXPLAIN對存儲過程進行分析
  • 早期版本的MySQL只支持對SELECT語句進行分析

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

-Advertisement-
Play Games
更多相關文章
  • Mysql: select * from 表名 where 欄位 like concat('%',變數,'%'); ...
  • 一 Oracle物理結構 上面的是Oracle基本物理體繫結構,下麵我們將從三部門介紹物理體繫結構 一 PGA部分 這一部門存的是用戶私有信息,主要用處是存儲用戶連接至Oracle實例的session信息,也用作數據的排序 二 SGA部分 1.共用池(shared pool) 2.數據緩存區(dat ...
  • 使用EMS MySQL Manager Pro(3.4.0.1)連接MySQL 5.6.20時,報錯:“SELECT command denied to user [email protected] for table 'proc' 很是納悶,後面使用同樣的許可權,發現使用命令工具mysql -h... ...
  • SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN ( SELECT DECODE (sql_hash_value, 0, prev_hash_value, sql_hash_value ...
  • 本文由雲+社區發表 做為大數據生態系統中最重要的底層存儲文件系統HDFS,為了保證系統的可靠性,HDFS通過多副本的冗餘來防止數據的丟失。通常,HDFS中每一份數據都設置兩個副本,這也使得存儲利用率僅為1/3,每TB數據都需要占用3TB的存儲空間。隨著數據量的增長,複製的代價也變得越來越明顯:傳統的 ...
  • 商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 提到‘資料庫’,首先被想到的肯定是Oracle、DB2、SQL Server、MySql這些傳統的關係型資料庫。資料庫的概念是非常寬泛的,除了上述的關係資料庫,還有NoSQL(Not Only SQL)資料庫,還有一些基於分散式技術框架(Hadoo ...
  • 正文 我們都知道MySQL邏輯備份工具 mysqldump 可以保證備份數據的一致性,但是它是怎麼保持一致性的? 本文不討論 mysqldump 具體的選項和用法,一直對 mysqldump 的工作機制梳理的不太清楚,這篇主要來分析下 mysqldump 的工作原理和工作步驟,瞭解它為什麼可以獲取一 ...
  • --替換回車符 REPLACE(exp, CHAR(13), '') --替換換行符 REPLACE(exp, CHAR(10), '') --水平製表符 REPLACE(exp, CHAR(9), '') ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...