MySQL查詢分析器EXPLAIN或DESC
MySQL可以通過EXPLAIN或DESC來查看並分析SQL語句的執行情況,如下需要計算2006年所有公司的銷售額,需要關聯sales表和company表,並且對money字段做求和操作,相應SQL如下:
Sql代碼
EXPLAIN SELECT SUM(money) FROM sales s,company c WHERE s.company_id=c.id AND s.year=2006 \G;
*************************** 1. row ***************************
id: 1 www.2cto.com
select_type: SIMPLE
table: s
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ref
possible_keys: index_company_id
key: index_company_id
key_len: 5
ref: sakila.c.company_id
rows: 1 www.2cto.com
Extra: Using where; Using index
列的說明:
select_type: 表示SELECT的類型,常見的有下面幾種
SIMPLE: 簡單表,不使用連接或子查詢的
PRIMARY: 主查詢,即外層的查詢
UNION: UNION中的第二個或者後面的查詢語句
SUBQUERY: 子查詢中的第一個SELECT
table: 輸出結果集的表
type: 表示表的連接類型,性能由好到差的連接類型為下面順序
system: 表中只有一行,即常量表
const: 單表中最多有一個匹配行,如primary key或unique index
eq_ref: 對於前面的每一行,在此表中只查詢一條記錄,也就是多表連接中使用primary key或unique index
ref: 與eq_ref類似,區別在於不是使用primary key或unique index,而是使用普通索引
ref_or_null: 與ref類型,區別在於條件中包含對null的查詢
index_merge: 索引合並優化
unique_subquery: in的後面是一個查詢主鍵字段的子查詢
index_subquery: 與unique_subquery類似,區別在於in的後面是查詢非唯一索引字段的子查詢 www.2cto.com
range: 單表中的范圍查詢
index: 對於前面的每一行,都通過查詢索引來得到數據
all: 對於前面的每一行,都通過掃描全表來得到數據
possible_keys: 查詢時可能用到的索引
key: 查詢時實際使用到的索引
key-len: 索引字段的長度
rows: 掃描行的數量
Extra: 執行情況的說明和描述
通過EXPLAIN的分析,確認在上面的例子中是對sales表的全表掃描導致效率不理想,通過對sales表創建索引: www.2cto.com
Sql代碼
CREATE INDEX index_sales_year ON sales(year);
創建索引後,再對該查詢語句分析如下:
Sql代碼
EXPLAIN SELECT SUM(money) FROM sales s,company c WHERE s.company_id=c.id AND s.year=2006 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: s
type: ref
possible_keys: index_seles_year
key: index_sales_year
key_len: 2
ref: const
rows: 1
Extra: Using where
*************************** 2. row ***************************
id: 1 www.2cto.com
select_type: SIMPLE
table: c
type: ref
possible_keys: index_company_id
key: index_company_id
key_len: 5
ref: sakila.c.company_id
rows: 1
Extra: Using where; Using index