查看Mysql執行計划


使用navicat查看mysql執行計划:

打開profile分析工具:

image

查看是否生效:show variable like ‘%profil%’;

image

查看進程:show processlist;

image

選擇數據庫:use db_jiakao;

image

全部分析的類型:show PROFILE all;

image

查看表索引:show index from user_member;##查看表索引

image

使用explain命令查看query語句的性能:

EXPLAIN select * from user_feedback;##查看執行計划中的sql性能

image

image

第一個查詢是全表掃描,第二個是索引掃描:

區別在於type:all是全表掃描 index 通過索引掃描

select_type:是否是復雜語句

下面是MySQL文檔關於ref連接類型的說明:

“對於每一種與另一個表中記錄的組合,MySQL將從當前的表讀取所有帶有匹配索引值的記錄。如果連接操作只使用鍵的最左前綴,或者如果鍵不是 UNIQUE或PRIMARY KEY類型(換句話說,如果連接操作不能根據鍵值選擇出唯一行),則MySQL使用ref連接類型。如果連接操作所用的鍵只匹配少量的記錄,則ref是一 種好的連接類型。”

在本例中,由於索引不是UNIQUE類型,ref是我們能夠得到的最好連接類型。

如果EXPLAIN顯示連接類型是“ALL”,而且你並不想從表里面選擇出大多數記錄,那么MySQL的操作效率將非常低,因為它要掃描整個表。你可以加入更多的索引來解決這個問題。預知更多信息,請參見MySQL的手冊說明。
possible_keys:
可能可以利用的索引的名字。這里的索引名字是創建索引時指定的索引昵稱;如果索引沒有昵稱,則默認顯示的是索引中第一個列的名字。默認索引名字的含義往往不是很明顯。

Key:
它顯示了MySQL實際使用的索引的名字。如果它為空(或NULL),則MySQL不使用索引。
key_len:
索引中被使用部分的長度,以字節計。
ref:
它顯示的是列的名字(或單詞“const”),MySQL將根據這些列來選擇行。在本例中,MySQL根據三個常量選擇行。
rows:
MySQL所認為的它在找到正確的結果之前必須掃描的記錄數。顯然,這里最理想的數字就是1。
Extra:
這里可能出現許多不同的選項,其中大多數將對查詢產生負面影響。在本例中,MySQL只是提醒我們它將用WHERE子句限制搜索結果集

 

◆ ID:Query Optimizer 所選定的執行計划中查詢的序列號;
◆ Select_type:所使用的查詢類型,主要有以下這幾種查詢類型
◇ DEPENDENT SUBQUERY:子查詢中內層的第一個SELECT,依賴於外部查詢的結果集;
◇ DEPENDENT UNION:子查詢中的UNION,且為UNION 中從第二個SELECT 開始的后面所有
SELECT,同樣依賴於外部查詢的結果集;
◇ PRIMARY:子查詢中的最外層查詢,注意並不是主鍵查詢;
◇ SIMPLE:除子查詢或者UNION 之外的其他查詢;
◇ SUBQUERY:子查詢內層查詢的第一個SELECT,結果不依賴於外部查詢結果集;
◇ UNCACHEABLE SUBQUERY:結果集無法緩存的子查詢;
◇ UNION:UNION 語句中第二個SELECT 開始的后面所有SELECT,第一個SELECT 為PRIMARY
◇ UNION RESULT:UNION 中的合並結果;
◆ Table:顯示這一步所訪問的數據庫中的表的名稱;
◆ Type:告訴我們對表所使用的訪問方式,主要包含如下集中類型;
◇ all:全表掃描
◇ const:讀常量,且最多只會有一條記錄匹配,由於是常量,所以實際上只需要讀一次;
◇ eq_ref:最多只會有一條匹配結果,一般是通過主鍵或者唯一鍵索引來訪問;
◇ fulltext:
◇ index:全索引掃描;
◇ index_merge:查詢中同時使用兩個(或更多)索引,然后對索引結果進行merge 之后再讀
取表數據;
◇ index_subquery:子查詢中的返回結果字段組合是一個索引(或索引組合),但不是一個
主鍵或者唯一索引;
◇ rang:索引范圍掃描;
◇ ref:Join 語句中被驅動表索引引用查詢;
◇ ref_or_null:與ref 的唯一區別就是在使用索引引用查詢之外再增加一個空值的查詢;
◇ system:系統表,表中只有一行數據;
◇ unique_subquery:子查詢中的返回結果字段組合是主鍵或者唯一約束;

◆ Possible_keys:該查詢可以利用的索引. 如果沒有任何索引可以使用,就會顯示成null,這一
項內容對於優化時候索引的調整非常重要;
◆ Key:MySQL Query Optimizer 從possible_keys 中所選擇使用的索引;
◆ Key_len:被選中使用索引的索引鍵長度;
◆ Ref:列出是通過常量(const),還是某個表的某個字段(如果是join)來過濾(通過key)
的;
◆ Rows:MySQL Query Optimizer 通過系統收集到的統計信息估算出來的結果集記錄條數;
◆ Extra:查詢中每一步實現的額外細節信息,主要可能會是以下內容:
◇ Distinct:查找distinct 值,所以當mysql 找到了第一條匹配的結果后,將停止該值的查
詢而轉為后面其他值的查詢;
◇ Full scan on NULL key:子查詢中的一種優化方式,主要在遇到無法通過索引訪問null
值的使用使用;
◇ Impossible WHERE noticed after reading const tables:MySQL Query Optimizer 通過
收集到的統計信息判斷出不可能存在結果;
◇ No tables:Query 語句中使用FROM DUAL 或者不包含任何FROM 子句;
◇ Not exists:在某些左連接中MySQL Query Optimizer 所通過改變原有Query 的組成而
使用的優化方法,可以部分減少數據訪問次數;
◇ Range checked for each record (index map: N):通過MySQL 官方手冊的描述,當
MySQL Query Optimizer 沒有發現好的可以使用的索引的時候,如果發現如果來自前面的
表的列值已知,可能部分索引可以使用。對前面的表的每個行組合,MySQL 檢查是否可以使
用range 或index_merge 訪問方法來索取行。
◇ Select tables optimized away:當我們使用某些聚合函數來訪問存在索引的某個字段的
時候,MySQL Query Optimizer 會通過索引而直接一次定位到所需的數據行完成整個查
詢。當然,前提是在Query 中不能有GROUP BY 操作。如使用MIN()或者MAX()的時
候;
◇ Using filesort:當我們的Query 中包含ORDER BY 操作,而且無法利用索引完成排序操
作的時候,MySQL Query Optimizer 不得不選擇相應的排序算法來實現。
◇ Using index:所需要的數據只需要在Index 即可全部獲得而不需要再到表中取數據;
◇ Using index for group-by:數據訪問和Using index 一樣,所需數據只需要讀取索引即
可,而當Query 中使用了GROUP BY 或者DISTINCT 子句的時候,如果分組字段也在索引
中,Extra 中的信息就會是Using index for group-by;
◇ Using temporary:當MySQL 在某些操作中必須使用臨時表的時候,在Extra 信息中就會
出現Using temporary 。主要常見於GROUP BY 和ORDER BY 等操作中。
◇ Using where:如果我們不是讀取表的所有數據,或者不是僅僅通過索引就可以獲取所有需
要的數據,則會出現Using where 信息;
◇ Using where with pushed condition:這是一個僅僅在NDBCluster 存儲引擎中才會出現
的信息,而且還需要通過打開Condition Pushdown 優化功能才可能會被使用。控制參數
為engine_condition_pushdown 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM