MySQL中EXPLAIN解釋命令詳解

来源:http://www.cnblogs.com/fan-Y/archive/2017/05/17/6869450.html
-Advertisement-
Play Games

MySQL中的explain命令顯示了mysql如何使用索引來處理select語句以及連接表。explain顯示的信息可以幫助選擇更好的索引和寫出更優化的查詢語句。 1.EXPLAIN的使用方法:在select語句前加上explain就可以了。 如:explain select surname,fi ...


MySQL中的explain命令顯示了mysql如何使用索引來處理select語句以及連接表。explain顯示的信息可以幫助選擇更好的索引和寫出更優化的查詢語句。

1.EXPLAIN的使用方法:
在select語句前加上explain就可以了。

如:explain select surname,first_name form a,b where a.id=b.id

2.EXPLAIN列的解釋:

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

type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、 indexhe和ALL

possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從WHERE語句中選擇一個合適的語句

key: 實際使用的索引。如果為NULL,則沒有使用索引。很少的情況下,MYSQL會選擇優化不足的索引。這種情況下,可以在SELECT語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MYSQL忽略索引

key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好

ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數

rows:MYSQL認為必須檢查的用來返回請求數據的行數

Extra:關於MYSQL如何解析查詢的額外信息。壞的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,結果是檢索會很慢

3.Extra列返回的描述的意義:

Distinct:一旦MYSQL找到了與行相聯合匹配的行,就不再搜索了

Not exists: MYSQL優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行,就不再搜索了

Range checked for each Record(index map:#):沒有找到理想的索引,因此對於從前面表中來的每一個行組合,MYSQL檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連接之一

Using filesort: 看到這個的時候,查詢就需要優化了。MYSQL需要進行額外的步驟來發現如何對返回的行排序。它根據連接類型以及存儲排序鍵值和匹配條件的全部行的行指針來排序全部行

Using index: 列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同一個索引的部分的時候

Using temporary 看到這個的時候,查詢需要優化了。這裡,MYSQL需要創建一個臨時表來存儲結果,這通常發生在對不同的列集進行ORDER BY上,而不是GROUP BY上

Where used 使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。如果不想返回表中的全部行,並且連接類型ALL或index,這就會發生,或者是查詢有問題不同連接類型的解釋(按照效率高低的順序排序)

system 表只有一行:system表。這是const連接類型的特殊情況

const:表中的一個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為MYSQL先讀這個值然後把它當做常數來對待

eq_ref:在連接中,MYSQL在查詢時,從前面的表中,對每一個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用

ref:這個連接類型只有在查詢使用了不是惟一或主鍵的鍵或者是這些類型的部分(比如,利用最左邊首碼)時發生。對於之前的表的每一個行聯合,全部記錄都將從表中讀出。這個類型嚴重依賴於根據索引匹配的記錄多少—越少越好

range:這個連接類型使用索引返回一個範圍中的行,比如使用>或<查找東西時發生的情況

index: 這個連接類型對前面的表中的每一個記錄聯合進行完全掃描(比ALL更好,因為索引一般小於表數據)

ALL:這個連接類型對於前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,應該儘量避免.

 

附上在微博系統中數據查詢性能分析的一個例子:

預設查詢,未使用索引

EXPLAIN SELECT * 
FROM microblogs
GROUP BY author

rows = 331 查詢所有行

去掉explain命令,執行select * from microblogs group by author,Query took 0.0001 sec

 

再看使用索引的效果:

EXPLAIN SELECT * 
FROM microblogs
USE INDEX ( author ) 
GROUP BY author

rows = 7 查詢只需7行

去掉explain命令,執行select * from microblogs use index (author) group by author, Query took 0.0001 sec

通過比較可以得知,使用索引必須檢查的行數由331變為7,是否資料庫的工作量降低,還有待更多研究,畢竟可能由於數據規模不夠大兩者的執行時間似乎並無差異。


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

-Advertisement-
Play Games
更多相關文章
  • Origin: 目前在 debug 一隻手機 的 charger 部分, 手機的充電電流與預測有落差, 便想使用 vendor evb board 來驗證, 但是 Rsense 不一致, 便跑去零件行。 evb 上已有一顆 Rsense,但和手機相比,仍較小, 想說用並的, 於是 買了一顆 歐姆最接 ...
  • 上面的是修改UIAlertViewController的title和message字體的大小和顏色,採用的是修改attributedString其中的NSForegroundColorAttributeName顏色屬性和NSFontAttributeName字體大小屬性。UIAlertViewCon ...
  • 準備工作: 1.下載java sdk 配置好java 環境 2.下載android sdk 跟 android studio 並配置好環境 1.查看平臺支持,添加android平臺 首先命令提示符進入到所在項目文件夾下 查看系統所支持 的平臺 因為我已經配置好環境了,所以在這裡我們能看到 andro ...
  • 回到目錄 關於redis連接數過高的解釋 對於node.js開發環境里,使用傳統的redis或者使用ioredis都是不錯的選擇,而在處理大數據請求程中,偶爾出現了連接池( redis服務端的最大可用連接數,預設為1萬)不夠用的情況,一般的提示如下: 在redis-cli上輸入info命令也可以進行 ...
  • 一行數據是如何來存儲的呢? 變長列與定長列,NULL與NOT NULL,實際是如何整理存放到 8k的數據頁上呢? 對錶格進行增減列,修改長度,添加預設值等DDL SQL,對行存儲結構又會有怎麼樣的影響呢? 什麼是大對象,什麼是行溢出,存儲引擎是如何處理它們呢? 如果轉載,請註明博文來源: www.c ...
  • 1. datetime(年月日時分秒) 格式:‘YYY-MM-DD HH:MM:SS’。 占用:8位元組 範圍:1000-01-01 00:00:00 到 9999-12-31 23:59:59。 tip:可以接收任意分隔符的日期,主要是判斷日期是否正確,是否在正確範圍內。 但是,不通用的分隔符可讀性 ...
  • 上一篇 講了在windows系統下的安裝和啟動,本文主要講怎麼建庫、刪庫、插入、更新 在講之前我們說一下mongoDB的一些基本概念,我們對比關係型資料庫能更直觀的理解 1.我們首先要啟動mongoDB伺服器,怎麼啟動看上一篇 2.打開shell,我們到mongoDB的安裝目錄下找到bin文件夾,進 ...
  • 本文從零開始一步一步介紹如何在Ubuntu上搭建SQL Server 2017,包括安裝系統、安裝SQL等相關步驟和方法(僅供測試學習之用,基礎篇)。 一. 創建Ubuntu系統(Create Ubuntu System) 1. 前提準備 由於本文主要研究SQL Server 2017在Linux上 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...