查詢是資料庫中最頻繁的操作,提高查詢速度可以有效的提高 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 即可。