1. 程式人生 > >MySQL 使用explain分析sql語句的查詢效率

MySQL 使用explain分析sql語句的查詢效率

Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。

Explain語法:

EXPLAIN tbl_name或:EXPLAIN [EXTENDED] SELECT select_options

前者可以得出一個表的欄位結構等等,後者主要是給出相關的一些索引資訊,而今天要講述的重點是後者。

例:

123456EXPLAIN SELECT sum(amount) FROM customer a, payment b WHERE1 = 1 AND a.customer_id = b.customer_id
AND a.email = '[email protected]';

執行結果:

下面對各個屬性進行了解:

1、id:這是SELECT的查詢序列號

2、select_type:select_type就是select的型別,可以有以下幾種:

SIMPLE:簡單SELECT(不使用UNION或子查詢等)

PRIMARY:最外面的SELECT

UNION:UNION中的第二個或後面的SELECT語句

DEPENDENT UNION:UNION中的第二個或後面的SELECT語句,取決於外面的查詢

UNION RESULT:UNION的結果。

SUBQUERY:子查詢中的第一個SELECT

DEPENDENT SUBQUERY:子查詢中的第一個SELECT,取決於外面的查詢

DERIVED:匯出表的SELECT(FROM子句的子查詢)

3、table:顯示這一行的資料是關於哪張表的實際的表名(如select * from customer;) 或表的別名 (如 select * from customer a);

4、type:這列最重要,顯示了連線使用了哪種類別,有無使用索引,是使用Explain命令分析效能瓶頸的關鍵項之一。

結果值從好到壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般來說,得保證查詢至少達到range級別,最好能達到ref,否則就可能會出現效能問題。

all: 意味著從表的第1行,往後,逐行做全表掃描.,運氣不好掃描到最後一行.

index: 比all效能稍好一點,
通俗的說: all 掃描所有的資料行,相當於data_all index 掃描所有的索引節點,相當於index_all

注:all是沿著磁碟掃描,index是沿著索引掃描

range: 意思是查詢時,能根據索引做範圍的掃描

explain select * from customer where customer_id > 4;

index_subquery 在子查詢中,基於除唯一索引之外的索引進行掃描;

unique_subquery 在子查詢中,基於唯一索引進行掃描,類似於EQ_REF;

index_merge 多重範圍掃描。兩表連線的每個表的連線欄位上均有索引存在且索引有序,結果合併在一起。適用於作集合的並、交操作。

ref_or_null 類似REF,只是搜尋條件包括:連線欄位的值可以為NULL的情況,比如 where col = 2 or col is null

fulltext 全文索引

ref 這也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬於查詢和掃描的混合體(也是範圍區間,不過比range更加精確)。

explain select * from payment where customer_id =4;

eq_ref 是指,通過索引列,直接引用某1行資料(精確到一行資料中)常見於連線查詢中

const, system, null 當mysql能對查詢的部分就行優化,並且轉換成一個常量的時候,它就會使用這種訪問型別了。比如你把一行的主鍵當做where條件放進去,那mysql就可以把它轉換成一個常量,然後查詢.

5、possible_keys:列指出MySQL能使用哪個索引在該表中找到行

6、key:顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL

7、key_len:顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度為NULL。使用的索引的長度。在不損失精確性的情況下,長度越短越好

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

9、rows:顯示MySQL認為它執行查詢時必須檢查的行數。

10、Extra:包含MySQL解決查詢的詳細資訊,也是關鍵參考項之一。

1234using index:出現這個說明mysql使用了覆蓋索引,避免訪問了表的資料行,效率不錯! using where:這說明伺服器在儲存引擎收到行後將進行過濾。有些where中的條件會有屬於索引的列,當它讀取使用索引的時候,就會被過濾,所以會出現有些where語句並沒有在extra列中出現using where這麼一個說明。 using temporary:這意味著mysql對查詢結果進行排序的時候使用了一張臨時表。 using filesort:這個說明mysql會對資料使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。
Distinct:一旦MYSQL找到了與行相聯合匹配的行,就不再搜尋了
Not exists: MYSQL 優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行,就不再搜尋了
Range checked for each
Record(index map:#):沒有找到理想的索引,因此對於從前面表中來的每一 個行組合,MYSQL檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連線之一

除此以外,explain 的extended 擴充套件能夠在原本explain的基礎上額外的提供一些查詢優化的資訊,這些資訊可以通過mysql的show warnings命令得到。下面是一個最簡單的例子。 

123456EXPLAIN EXTENDEDSELECT sum(amount)FROM customer a, payment bWHERE 1 = 1AND a.customer_id = b.customer_idAND a.email = '[email protected]';

接下來再執行Show Warnings  

12345678910111213141516171819202122232425mysql> show warnings;+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Level | Code | Message|+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Warning | 1681 | 'EXTENDED' is deprecated and will be removed in a future release.|| Note | 1003 | /* select#1 */ select sum(`sakila`.`b`.`amount`) AS `sum(amount)` from `sakila`.`customer` `a` join `sakila`.`payment` `b` where ((`sakila`.`b`.`customer_id` = `sakila`.`a`.`customer_id`) and (`sakila`.`a`.`email` = 'JANE[email protected]')) |+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)

可以看到優化器自動去除了1=1恆成立的條件。 

MySQL5.1開始支援分割槽功能,同時explain命令也增加了對分割槽的支援。可以通過explain partitions 命令檢視SQL所訪問的分割槽。

相關推薦

Mysql explain分析sql語句執行效率

mysql優化–explain分析sql語句執行效率 Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 Explain語法:explain sel

mysql優化–explain分析sql語句執行效率

  Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 Explain語法:explain select … from …

mysql優化(三)–explain分析sql語句執行效率

mushu 釋出於 11個月前 (06-04) 分類:Mysql 閱讀(651) 評論(0) Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出

Explain分析sql語句執行效率

使用Explain命令會有以下屬性輸出:        1》id:這是SELECT的查詢序列號        2》select_type:select_type就是select的型別:   &n

MySQL 使用explain分析sql語句查詢效率

Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。Explain語法:EXPLAIN tbl_name或:EXPLAI

MySQL 使用explain分析sql語句查詢效率(一)

MySQL explain用於分析sql 語句的執行及資料庫索引的使用。本文將致力於幫助大家充分理解explain所返回的各項引數,從而使大家快速掌握explain用法技巧。如果你在看其他教程或視訊後仍覺得雲裡霧裡。那麼請通讀本文。 用法 explain的用法相當簡潔

MySQL 使用explain分析sql語句查詢效率(二)

本文將繼續上文講解其他與效率相關的引數 explain所返回的其他引數key為使用的索引,而使用的索引又影響著連線型別type,它們共同決定了可能掃描行數rows 引數解析 (4)type (重點) 聯接型別。查詢效率的關鍵,下面按照從最佳型

mysql 慢日誌開啟 及explain 分析sql語句

檢視當前資料庫是否開啟了日誌: mysql > show variables like 'log_%'; mysql 的日誌型別有以下幾種: +---------------------------------+----------------------------

MySQL查看SQL語句執行效率

博客 union pan art 顯示 uniq left join 匹配 article Explain命令在解決數據庫性能上是第一推薦使用命令,大部分的性能問題可以通過此命令來簡單的解決,Explain可以用來查看 SQL 語句的執行效 果,可以幫助選擇更好的索引和優化

淺談MySQL中優化sql語句查詢常用的30種方法

系統資源 all 數據量過大 連續 don 問題 not sele 客戶端 1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用

explain 分析sql語句

ons 信息 提高 循環 訪問 dev har group by tro https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247485618&idx=1&sn=ed892f572b81e6

淺談 MySQL 中優化 SQL 語句查詢常用的 30 種方法

個數 尋找 情況 don union all 子句 set 其他 算術 1、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2、應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引

explain分析SQL語句詳解

效能分析explain  MySql Query Optimizer是MySql中專門負責優化select語句的優化器模組,主要功能:通過計算分析系統中收集到的系統資訊,為客戶端請求的Query提供他認為最優的執行計劃(系統認為最優的資料檢索方式,但不見得是DBA認為最優的,這部分最耗費時間) MySQL常

MySQL中優化sql語句查詢常用的方法

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 3.應儘量避免在 where 子句中對欄位進行 null 值

MySQL - 如何提高SQL查詢效率(where條件優化)

目錄 說在前面 35條優化規則 總結 說在前面 整天說SQL優化,SQL優化,到底怎麼才算是SQL優化呢,下面從百度總結了一些關於Oracle裡常用的一些有效的優化方法。僅供參考,文章內容來源於網路。 35條優化規則 (1)優先考慮建立索引 對查詢進行優化,應

013-- mysql常用的查詢優化方法 淺談MySQL中優化sql語句查詢常用的30種方法

淺談MySQL中優化sql語句查詢常用的30種方法   1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全

explain 分析sql語句欄位的解釋

+----+-------------+-------+------------+------+---------------+-----+---------+------+------+----------+-------+ | id | select_typ

Mysql中使用sql語句查詢前一個天、前一週、前一月時間的方法

查詢一天:select * from 表名 where to_days(時間欄位名) = to_days(now());昨天SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 時間欄位名) <= 17天SELECT *

利用EXPLAIN分析sql語句的效能

使用explain關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的sql語句,可以幫助選擇更好的索引和寫出更優化的查詢語句。。 使用explain我看可以sql執行的相關資訊: 表的讀取順序 資料讀取操作的操作型別 哪些索引可以使用

php中mysql一條sql語句查詢出所有符合條件的資料,該怎麼寫?

假如一個表裡有個classid欄位是類別的id,我想用一條sql語句查出classid=5的所有資料的id該怎麼查呢?正常是要迴圈,放到數組裡的吧 如圖,我想查詢classid=2的對應所有id,用