MySQL——通過EXPLAIN分析SQL的執行計劃

在MySQL中,我們可以通過EXPLAIN命令獲取MySQL如何執行SELECT語句的信息,包括在SELECT語句執行過程中表如何連接和連接的順序。

下面分別對EXPLAIN命令結果的每一列進行說明:

  • select_type:表示SELECT的類型,常見的取值有:

    類型說明
    SIMPLE簡單表,不使用表連接或子查詢
    PRIMARY主查詢,即外層的查詢
    UNIONUNION中的第二個或者后面的查詢語句
    SUBQUERY子查詢中的第一個
  • table:輸出結果集的表(表別名)

  • type:表示MySQL在表中找到所需行的方式,或者叫訪問類型。常見訪問類型如下,從上到下,性能由差到最好:

    ALL全表掃描
    index索引全掃描
    range索引范圍掃描
    ref非唯一索引掃描
    eq_ref唯一索引掃描
    const,system單表最多有一個匹配行
    NULL不用掃描表或索引
    1. type=ALL,全表掃描,MySQL遍歷全表來找到匹配行

      一般是沒有where條件或者where條件沒有使用索引的查詢語句

      EXPLAIN SELECT * FROM customer WHERE active=0;

    2. type=index,索引全掃描,MySQL遍歷整個索引來查詢匹配行,并不會掃描表

      一般是查詢的字段都有索引的查詢語句

      EXPLAIN SELECT store_id FROM customer;

    3. type=range,索引范圍掃描,常用于<、<=、>、>=、between等操作

      EXPLAIN SELECT * FROM customer WHERE customer_id>=10 AND customer_id<=20;

      注意這種情況下比較的字段是需要加索引的,如果沒有索引,則MySQL會進行全表掃描,如下面這種情況,create_date字段沒有加索引:

      EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13' ;

    4. type=ref,使用非唯一索引或唯一索引的前綴掃描,返回匹配某個單獨值的記錄行

      store_id字段存在普通索引(非唯一索引)

      EXPLAIN SELECT * FROM customer WHERE store_id=10;

      ref類型還經常會出現在join操作中:

      customerpayment表關聯查詢,關聯字段customer.customer_id(主鍵),payment.customer_id(非唯一索引)。表關聯查詢時必定會有一張表進行全表掃描,此表一定是幾張表中記錄行數最少的表,然后再通過非唯一索引尋找其他關聯表中的匹配行,以此達到表關聯時掃描行數最少。

      因為customerpayment兩表中customer表的記錄行數最少,所以customer表進行全表掃描,payment表通過非唯一索引尋找匹配行。

      EXPLAIN SELECT * FROM customer customer INNER JOIN payment payment ON customer.customer_id = payment.customer_id;

    5. type=eq_ref,類似ref,區別在于使用的索引是唯一索引,對于每個索引鍵值,表中只有一條記錄匹配

      eq_ref一般出現在多表連接時使用primary key或者unique index作為關聯條件。

      film、film_text表關聯查詢和上一條所說的基本一致,只不過關聯條件由非唯一索引變成了主鍵。

      EXPLAIN SELECT * FROM film film INNER JOIN film_text film_text ON film.film_id = film_text.film_id;

    6. type=const/system,單表中最多有一條匹配行,查詢起來非常迅速,所以這個匹配行的其他列的值可以被優化器在當前查詢中當作常量來處理

      const/system出現在根據主鍵primary key或者 唯一索引 unique index 進行的查詢

      根據主鍵primary key進行的查詢:

      EXPLAIN SELECT * FROM customer WHERE customer_id =10;

      根據唯一索引unique index進行的查詢:

      EXPLAIN SELECT * FROM customer WHERE email ='MARY.SMITH@sakilacustomer.org';

      ?

    7. type=NULL,MySQL不用訪問表或者索引,直接就能夠得到結果

  • possible_keys: 表示查詢可能使用的索引

  • key: 實際使用的索引

  • key_len: 使用索引字段的長度

  • ref: 使用哪個列或常數與key一起從表中選擇行。

  • rows: 掃描行的數量

  • filtered: 存儲引擎返回的數據在server層過濾后,剩下多少滿足查詢的記錄數量的比例(百分比)

  • Extra: 執行情況的說明和描述,包含不適合在其他列中顯示但是對執行計劃非常重要的額外信息

    最主要的有一下三種:

    Using Index表示索引覆蓋,不會回表查詢
    Using Where表示進行了回表查詢
    Using Index Condition表示進行了ICP優化
    Using Flesort表示MySQL需額外排序操作, 不能通過索引順序達到排序效果

什么是ICP?

MySQL5.6引入了**Index Condition Pushdown(ICP)**的特性,進一步優化了查詢。Pushdown表示操作下放,某些情況下的條件過濾操作下放到存儲引擎。

EXPLAIN SELECT * FROM rental WHERE rental_date='2005-05-25' AND customer_id>=300 AND customer_id<=400;

在5.6版本之前:

優化器首先使用復合索引idx_rental_date過濾出符合條件rental_date='2005-05-25'的記錄,然后根據復合索引idx_rental_date回表獲取記錄,最終根據條件customer_id>=300 AND customer_id<=400過濾出最后的查詢結果(在服務層完成)。

在5.6版本之后:

MySQL使用了ICP來進一步優化查詢,在檢索的時候,把條件customer_id>=300 AND customer_id<=400也推到存儲引擎層完成過濾,這樣能夠降低不必要的IO訪問。Extra為Using index condition就表示使用了ICP優化。

參考

《深入淺出MySQL》


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-----END-----


? ? ?喜歡本文的朋友們,歡迎掃一掃下圖關注公眾號擼碼那些事,收看更多精彩內容

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277539.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python將argv作為參數_在jupyter / ipython notebook中將命令行參數傳遞給argv

經過大量的環顧后,我發現了非常繁瑣的自定義庫,但是用幾行代碼解決了它,我認為這些代碼很漂亮.我使用nbconvert最終得到一個html報告作為輸出,包含筆記本中的所有圖形和降價,但是通過最小的python包裝器接受命令行參數&#xff1a;python文件test_args.py(正常執行命令行參數)&…

模擬輸入(ADC-A0)

ESP8266具有內置的10位ADC&#xff0c;只有一個ADC通道(A0引腳)&#xff0c;即只有一個ADC輸入引腳可讀取來自外部器件的模擬電壓 ESP8266上的ADC通道和芯片供電電壓復用&#xff0c;也就是說我們可以將其設置為測量系統電壓或者外部電壓 測量外部電壓&#xff1a; analogRead(…

SQL Server 連接超時案例一則

原文:SQL Server 連接超時案例一則上周六&#xff0c;一工廠系統管理員反饋一數據庫連接不上&#xff0c;SSMS連接數據庫報“連接超時時間已到。在嘗試使用預登錄握手確認時超過了此超時時間.......”, 如下截圖所示&#xff1a; 另外遠程連接也連接不上&#xff0c;系統管理員…

mysql 刪除5天前 備份_mysql自動備份刪除5天前的備份

1、查看磁盤空間情況&#xff1a;df -h2、創建備份目錄&#xff1a;上面我們使用命令看出/home下空間比較充足&#xff0c;所以可以考慮在/home保存備份文件&#xff1b;cd /homemkdir backupcd backup3、創建備份Shell腳本:注意把以下命令中的DatabaseName換為實際的數據庫名稱…

個人作業-Alpha項目測試

這個作業屬于哪個課程https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2作業地址https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340團隊名稱腦闊疼https://www.cnblogs.com/chaserFF/p/10994338.html這個作業的目標完成班級項目互評…

深入理解brew link命令

來源&#xff1a;https://newsn.net/say/brew-link-php71.html brew是mac機上面程序猿非常常用的軟件包安裝方式&#xff0c;其中有兩組命令是需要大家知曉的。分別是&#xff1a;第一組&#xff1a;brew install和brew uninstall。第二組&#xff0c;brew link和brew unlink。…

scss2css vscode設置_VSCode下讓CSS文件完美支持SCSS或SASS語法方法

VSCode下讓CSS文件完美支持SCSS或SASS語法方法習慣Webpack PostCSS后, 通常PostCSS都是直接對CSS文件進行處理, 但是大部分習慣SCSS/SASS/LESS的朋友也許不適應了. 我專門研究了一下, 在Visual Studio Code編輯器下如果配置相關代碼和設置達到CSS文件完美編寫SCSS的辦法, 其他…

第5章 初識JQuery

JQuery是對JavaScript的封裝&#xff0c;簡化了JS代碼&#xff0c;是主流框架的基礎(VUE,EasyUI,Bootstrap) 它是2006年推出的JQuery的優勢&#xff1a; 體積小&#xff0c;壓縮后只有100KB左右 強大的選擇器 出色的DOM封裝 可靠的事件處理機制 出色的瀏覽器兼容性 使用隱式迭代…

Jenkins的Pipeline腳本在美團餐飲SaaS中的實踐

2019獨角獸企業重金招聘Python工程師標準>>> 一、背景 在日常開發中&#xff0c;我們經常會有發布需求&#xff0c;而且還會遇到各種環境&#xff0c;比如&#xff1a;線上環境&#xff08;Online&#xff09;&#xff0c;模擬環境&#xff08;Staging&#xff09;&…

6.12交流

czy bzoj5424燒橋計劃 f[i][j]暴力&#xff0c;可以分兩段轉移&#xff0c;更近的一段單調隊列 發現&#xff0c;最多分成sqrt(n)段。 因為如果只有一段&#xff0c;ansn*2000 而如果多段&#xff0c;至少是∑i*1000&#xff0c;那么&#xff0c;i的上界是sqrt(n)級別的。 所以…

java橢圓_如何用java畫橢圓

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓利用java畫出橢圓。也就是鼠標一邊移動一邊顯示出橢圓&#xff0c;如何做到請大神指教這是我寫的(沒有達到我自己的要求)&#xff1a;import java.awt.*;import java.awt.Graphics;import java.awt.event.*;import javax.swing.*;i…

【springboot+easypoi】一行代碼搞定excel導入導出

原文&#xff1a;https://www.jianshu.com/p/5d67fb720ece 開發中經常會遇到excel的處理&#xff0c;導入導出解析等等&#xff0c;java中比較流行的用poi&#xff0c;但是每次都要寫大段工具類來搞定這事兒&#xff0c;此處推薦一個別人造好的輪子【easypoi】&#xff0c;下面…

用java編寫一個計算器_用java程序編寫一個計算器

展開全部給你一個參考&#xff0c;希望不62616964757a686964616fe58685e5aeb931333330343261要被百度吞了當晚餐import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.text.DecimalFor…

TypeScript基礎入門 - 接口 - 可索引的類型

轉載地址 TypeScript基礎入門 - 接口 - 可索引的類型 項目實踐倉庫 https://github.com/durban89/typescript_demo.git tag: 1.0.11 為了保證后面的學習演示需要安裝下ts-node&#xff0c;這樣后面的每個操作都能直接運行看到輸出的結果。 npm install -D ts-node 后面自己在練…

jquery中的ajax方法(備忘)

參考&#xff1a;https://www.cnblogs.com/tylerdonet/p/3520862.html w3school:http://www.w3school.com.cn/jquery/ajax_ajax.asp 1.url: 要求為String類型的參數&#xff0c;&#xff08;默認為當前頁地址&#xff09;發送請求的地址。 2.type: 要求為String類型的參數&…

java高級類_Java高級類特性(一)

權限類內同包不同包子類不同包非子類private√default√√protected√√√public√√√√四、super關鍵字的使用package com.test.java;/** super可以用來修飾屬性、方法、構造器* 1)當子類與父類中有同名的屬性時&#xff0c;可以通過"super.屬性"顯式的調用父類中聲…

Android.對話框(AlertDialog/Toast/Snackbar)

1、資料&#xff1a; 1.1、Android提醒微技巧&#xff0c;你真的了解Dialog、Toast和Snackbar嗎&#xff1f; - CSDN博客.html&#xff08;https://blog.csdn.net/guolin_blog/article/details/51336415&#xff09; 1.2、Android界面設計之對話框——定制Toast、AlertDialog -…

第4次作業

轉載于:https://www.cnblogs.com/wzh2920330283/p/11027254.html

基于Docker搭建Percona XtraDB Cluster數據庫集群

本文實驗的環境參數 阿里云ECS Centos7.5Docker version 18.06.0-cepercona/percona-xtradb-cluster:5.7Percona XtraDB Cluster的鏡像下載地址&#xff1a;https://hub.docker.com/r/percona/percona-xtradb-cluster/ 怎么使用Docke和下載鏡像&#xff0c;請查看Docker的官方文…

java publickey_數字證書中讀取PublicKey

1. 讀取https簽發證書中的key1) 在下面的代碼中,是實現讀取證書字符串來讀取key的,CERTIFICATE 就是一個證書的字符串, 而方法cf.generateCertificate() 接受的是一個InputStream 流,當然這個地方也可以讀取一個文件 new FileInputSream("file path")即可!public Str…