MySQL EXPLAIN和DESCRIBE(查詢分析器)

2020-07-16 10:05:27
查詢是資料庫中最頻繁的操作,提高查詢速度可以有效的提高 MySQL 資料庫的效能。在《MySQL效能優化簡述》一節我們了解了如何查詢效率低下的 SQL 語句,本節主要介紹如何分析查詢語句。

通過對查詢語句的分析,可以了解查詢語句的執行情況,找出查詢語句執行的瓶頸,從而優化查詢語句。在 MySQL 中,可以使用 EXPLAIN 和 DESCRIBE 獲取 MySQL 執行 SELECT 語句的資訊,來分析查詢語句。

EXPLAIN 語句的基本語法如下:

EXPLAIN SELECT 語句;

“SELECT 語句”引數一般為資料庫查詢命令,如“SELECT * FROM tb_student”。通過 EXPLAIN 關鍵字可以分析後面 SELECT 語句的執行情況,並且能夠分析出所查詢表的一些內容。

例 1

下面使用 EXPLAIN 語句來分析一個查詢語句。程式碼執行如下:
mysql> EXPLAIN SELECT * FROM tb_student G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb_student
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 7
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.01 sec)
對以上結果中引數說明如下:

1)id

表示 SELECT 語句的編號,也就是在整個查詢中 SELECT 的位置。如果在語句中沒子查詢或關聯查詢,只有唯一的 SELECT,每行都將顯示 1。否則,內層的 SELECT 語句一般會順序編號,對應於其在原始語句中的位置。

2)select_type

表示 SELECT 語句的型別,該引數有以下幾個常用的取值:
  • SIMPLE:表示簡單查詢,其中不包括連線查詢和子查詢;
  • PRIMARY:表示主查詢,或者是最外層的查詢語句;
  • UNION:表示連線查詢的第二個或後面的查詢語句;
  • DEPENDENT UNION:連線查詢中的第 2 個或後面的 SELECT 語句,取決於外面的查詢;
  • UNION RESULT:連線查詢的結果;
  • SUBQUERY:子查詢中的第 1 個 SELECT 語句;
  • DEPENDENT SUBQUERY:子查詢中的第 1 個 SELECT 語句,取決於外面的查詢;
  • DERIVED:匯出表的 SELECT(FROM 子句的子查詢)。

4)table

表示查詢的表;

5)type

表示表的連線型別。該引數有以下幾個常用的取值,範圍從 NULL 到 ALL。下面按照最佳型別到最差型別排序:
  • NULL:不用存取表或者索引,直接就能得到結果;
  • system:表示表中只有一條記錄;
  • const:表示表中有多條記錄,但只從表中查詢一條記錄;
  • eq _ref:類似 ref,表示多表連線時,後面的表使用了 UNIQUE 或者 PRIMARY KEY;
  • ref:表示多表查詢時,後面的表使用了普通索引;
  • range:表示查詢語句中給出了查詢範圍,常見於 <、<=、>、>=、between 等操作符;
  • index:表示對表中的索引進行了完整的掃描,MySQL 遍歷整個索引來查詢匹配的行;
  • ALL:表示對表進行了完整的掃描,MySQL 遍歷全表來找到匹配的行。

6)possible_keys

表示查詢中可以使用的索引;

7)key

表示實際查詢中使用到的索引;

8)key_len

表示索引欄位的長度;

9)ref

表示使用哪個列或常數與索引一起來查詢記錄;

10)rows

表示查詢的行數;

11)filtered

MySQL 5.7 版本之前使用 EXPLAIN EXTENDED 時會出現這個欄位,MySQL 5.7 版本之後包括 5.7 版本預設就有這個欄位。這個欄位表示儲存引擎返回的資料在 server 層過濾後,剩下多少滿足查詢記錄數量的比例。注意是百分比,不是具體記錄數。

12)Extra

表示查詢過程的附件資訊。

DESCRIBE 語句的使用方法與 EXPLAIN 語句一樣,DESCRIBE 語句的語法形式如下:

DESCRIBE SELECT語句;

DESCRIBE 可以縮寫成 DESC。

例 2

下面使用 DESCRIBE 語句來分析一個查詢語句。程式碼執行如下:
mysql> DESCRIBE SELECT * FROM tb_student G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb_student
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 7
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
可以看出,以上執行結果與例 1 基本相同,這裡不再對上述引數進行說明,參考例 1 即可。