使用LAMP系列技術快一年了 雖然知道web應用的瓶頸通常是在數據庫
但是卻一直沒有仔細研究數據庫語句的性能優化
今天就從 EXPLAIN 開始整理吧
EXPLAIN 查詢語句會返回以下欄目
id select_type table type possible_keys key key_len ref rows extra
id:不重要 此為SELECT的查詢序列號
select_type:SELECT 類型 可以為以下這幾種類型
------------------------------------------
SIMPLE 簡單的SELECT(沒有UNION或子查詢)
PRIMARY
UNION
DEPENDENT UNION
UNION RESULT
SUBQUERY
DEPENDENT SUBQUERY
DERIVED
------------------------------------------
table:輸出的行所引用的表(應該就是查詢了哪些表的意思)
type:鏈接類型 從 最佳類型 到 最壞類型
---------------------------------------------
system 表僅有一行(=系統表). const 聯接類型的特例
const 表最多有一個匹配行,它將在查詢開始時被讀取 const用於用常數值比較PRIMARY KEY或UNIQUE索引的所有部分時
eq_ref 可以用於使用= 操作符比較的帶索引的列
ref 可以用於使用=或<=>操作符的帶索引的列。
ref_or_null 該聯接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經常使用該聯接類型的優化
例子:
SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL
index_merge 該聯接類型表示使用了索引合並優化方法
unique_subquery
該類型替換了下面形式的IN子查詢的ref:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery是一個索引查找函數,可以完全替換子查詢,效率更高。
index_subquery
該聯接類型類似於unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range
只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關鍵元素。在該類型中ref列為NULL。
當使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比較關鍵字列時,可以使用range:
SELECT * FROM tbl_name
WHERE key_column = 10;
SELECT * FROM tbl_name
WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name
WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name
WHERE key_part1= 10 AND key_part2 IN (10,20,30);
index 全掃描索引樹 與 ALL 性質差不多
ALL 全表掃描 很糟糕的情況
---------------------------------------------
possible_keys 可能使用的索引
key 實際使用的索引
key_len 決定使用的鍵長度
ref 顯示使用哪個列或常數與KEY一起選擇行
rows 執行查詢時必須檢查的行數
Extra