好程式設計師Java學習路線之MySQL的執行計劃
好程式設計師 Java 學習路線之 MySQL 的執行計劃。什麼是執行計劃? 執行計劃通常是開發者最佳化 SQL 語句的第一步。 MySQL 在解析 SQL 語句時,會生成多套執行方案,然後內部會進行一個成本的計算,然後透過最佳化器選擇一個最優的方案執行,然後根據這個方案會生成一個執行計劃。開發者透過檢視 SQL 語句的執行計劃,可以直觀的瞭解到 MySQL 是如何解析執行這條 SQL 語句的,然後再針對性的進行最佳化。
如何檢視 SQL 語句的執行計劃?
語法: explain select 語句 ;
執行計劃每個欄位的含義:
id (重要) :主要用來標識 SQL 語句的解析執行順序
id 相同的情況:
id 不同的情況:
id 相同不同同時存在:
id 為 null 的情況:
比較少見, id 為 null 的部分一定是最後執行的
select_type:主要用來標識當前查詢的型別
mysql 查詢的分類:
簡單查詢:沒有子查詢以及 union 的 sql
複雜查詢: where 和 select 後面有子查詢
from 後面有子查詢
包換 union 關鍵字
SIMPLE :標識當前查詢是一個簡單查詢
PRIMARY :如果是一個複雜查詢(子查詢或者 union ),則最外層的 SQL 語句會被標記成這個型別
SUBQUERY :用來標記一個子查詢( where 、 select )
注意:通常來說被標記成 PRIMARY 的部分,是最後執行的部分
DERIVED :用來標記一個衍生查詢( from 後面的子查詢)
UNION :標記 union 關鍵字後面的查詢部分
UNION RESULT :標記 union 結果的合併部分
type( 重要 ) :用來標識當前這條 SQL 語句是用哪種方式訪問的資料行(最差 -> 最優)
all :表示當前 MySQL 是採用全表掃描的方式訪問的資料行
index :表示當前是按照全索引掃描的方式訪問所有資料行
range :表示查詢了索引的某個範圍
ref :表示查詢了索引的某個值,但是這個值是可能重複的(只會出現在非唯一性索引的欄位上)
eq_ref :表示查詢了索引的某個值,但是這個值是唯一的(只會出現在主鍵、唯一性索引上,並且需要結合連線查詢)
const :查詢索引的某個唯一性值, mysql 會將這個條件最佳化成一個常量
system (正式開發基本不會出現):表示 mysql 可以確定查詢的表結果一定只有一條
null (效能最好,但是作用不大):表示當前 SQL 語句直接在解析時就能獲得結果,不能去查詢記錄行
注意:通常在實際開發過程中,需要將 SQL 語句最佳化到 range 以上的級別,但是一定要具體問題具體分析,有些時候 all 反而是更好的行為。
possible_keys :用來標記當前這條 SQL 語句可能用上的索引列表
key (重要) :用來標識當前這個 SQL 語句用上了哪個索引
注意:有可能一個索引出現在 possible_keys 中,但是沒有出現在 key 中;也有可能一個索引出現在 key 中,但是沒有出現在 possible_keys 中。
explain select * from student force index(idx_age) order by age;
標識手動設定 MySQL 執行的索引,但是最好不要這麼幹
key_len:標識當前使用到的索引長度,這個值越大,說明越多的條件使用上了索引
rows( 重要 ) :表示當前查詢可能訪問的記錄行數,這個值越小越好,最好顯示 1
注意:通常在實際的最佳化過程中,需要參考 type 和 rows 兩個欄位來決定是否需要進行最佳化。
比如 type 為 all ,但是 rows 為 1 ,這種情況下,其實完全無需最佳化。
比如 type 為 ref, 但是 rows 為 10W ,那麼這條 sql 語句效能肯定比不上 all - 1
Extra( 重要 ) :表示當前一些額外的資訊顯示的地方
Using index :說明當前的執行計劃用上了覆蓋索引。
Using temporary :說明當前內部使用了臨時表 ( 分組、排序 )
Using filesort :說明使用了檔案排序,這個排序有可能在記憶體上排序,也有可能在硬碟上排序,如果是在硬碟上排序,則最好最佳化一下(比如透過索引進行排序)
Using where :表示使用了過濾條件
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2652486/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java學習路線之集程式設計師Java
- 好程式設計師Java學習路線分享多執行緒概念程式設計師Java執行緒
- 好程式設計師Java學習路線分享MyBatis之執行緒最佳化程式設計師JavaMyBatis執行緒
- 好程式設計師Java學習路線之SpringMVC之基本配置程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享MySQL目錄結構程式設計師JavaMySql
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 好程式設計師Java學習路線分享SpringCloud程式設計師JavaSpringGCCloud
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java學習路線分享SpringMVC之MVC概述程式設計師JavaSpringMVC
- 好程式設計師大資料學習路線分享hive的執行方式程式設計師大資料Hive
- 好程式設計師大資料學習路線分享大資料之執行緒程式設計師大資料執行緒
- 好程式設計師Java學習路線之Spring框架之動態代理程式設計師JavaSpring框架
- 好程式設計師Java學習路線分享原生Ajax的使用程式設計師Java
- 好程式設計師Java學習路線分享mybatis對映程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享MyBatis之關聯查詢程式設計師JavaMyBatis
- 好程式設計師告訴你Java架構師學習路線程式設計師Java架構
- 好程式設計師Java學習路線之Java中的物件流和序列化程式設計師Java物件
- 好程式設計師Java學習路線分享Java中的位移運算程式設計師Java
- 好程式設計師Java學習路線分享Java面試題之載入機制程式設計師Java面試題
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- 好程式設計師大資料學習路線分享執行緒學習筆記二程式設計師大資料執行緒筆記
- 好程式設計師大資料學習路線分享多執行緒學習筆記程式設計師大資料執行緒筆記
- 好程式設計師Java學習路線分享Redis快速入門程式設計師JavaRedis
- 好程式設計師Java學習路線分享JVM相關概念程式設計師JavaJVM
- 好程式設計師Java學習路線分享maven是什麼程式設計師JavaMaven
- 好程式設計師Java學習路線分享SpringMVC之請求和響應程式設計師JavaSpringMVC
- 好程式設計師大資料學習路線之mapreduce概述程式設計師大資料
- 好程式設計師Java學習路線分享Java弱引用的理解與使用程式設計師Java
- 好程式設計師Java學習路線分享Java-String常用方法程式設計師Java
- 好程式設計師Java學習路線Java bean是個什麼概念程式設計師JavaBean
- 好程式設計師Java學習路線分享Dubbo架構介紹程式設計師Java架構
- 好程式設計師Java學習路線分享finalize()方法詳解程式設計師Java
- 好程式設計師Java學習路線分享三大特性之多型程式設計師Java多型
- 好程式設計師web前端學習路線之Javascript物件導向程式設計師Web前端JavaScript物件
- 好程式設計師大資料學習路線分享spark之Scala程式設計師大資料Spark
- 好程式設計師大資料學習路線之zookeeper乾貨程式設計師大資料
- 好程式設計師Java學習路線分享Java案例-封裝JDBC工具類程式設計師Java封裝JDBC