參考**:
執行計畫是sql效能調優的有效工具,通過執行執行計畫,我們能知道查詢的瓶頸在**?是否需要索引以及更改改變sql語句。
一、開啟執行計畫
mysql執行計畫預設是關閉的,需要開啟
set profiling="on";
使用show variables like "%profil%";檢視是否開啟執行計畫
二、執行計畫的應用
只需要在查詢語句前新增explain 即可,mysql5.6以後支援update/delete 執行計畫,以前需要寫變異的select語句!!!
三、名詞解釋
id:
select識別符,數字越大越先執行,數值相同從上往下執行。
select_type:select型別
(1)、****** :簡單型別,一般不包含子查詢和union.
(2)、union : 聯合查詢。一般只union 後的select
(3)、primary : 主鍵查詢。一般指外層的select。
(4)、derived :from中的select。
(5)、dependent subquery: 子查詢中國的第乙個select,取決於外面的查詢。
..... 更多參考後面的參數列。
table: 輸出的行所在的表。
type: 連線型別
system:system表只有一行資料。** 這是const的特例。
const: 使用primary key or unique索引,且只找到一條資料。
eq_ref:使用primary key or unique索引時,從前表中找到一行與之匹配。** 也就是使用primary or unique是一對多的關係,例如teacher_id設定為主鍵,查詢該teacher所有的student,就會使用到eq_ref。
ref 對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,或如果鍵不是
unique
或primary key
(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用
ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的
ref_or_null
:該聯接型別如同
ref,但是新增了
mysql
可以專門搜尋包含
null
值的行。在解決子查詢中經常使用該聯接型別的優化。
range: 只檢索給定範圍的行,使用乙個索引來選擇行。
index:
該鏈結型別與all相同,除了只有索引樹被掃瞄。
all: 全表掃瞄。
possible_keys:找到資料所在行能夠使用的索引。
keys: mysql使用的索引。
key_len:mysql使用的長度。
ref:
列顯示使用哪個列或常數與
key一起從表中選擇行。
rows:mysql 認為他執行查詢必須要執行的行數,
filtered:顯示了通過條件過濾的行數的百分比估計值。
extra:
該列包含
mysql
解決查詢的詳細資訊。
d istinct:
mysql
發現第1
not exists:
range checked for each record:沒有找到合適的索引。
using filesort:一般看到這裡就需要優化了,一般這是是使用mysql本身的演算法進行排序吧
** mysql手冊解釋:
mysql
需要額外的一次傳遞,以找出如何按排序順序檢索行。通過根據聯接型別瀏覽所有行並為所有匹配
where
子句的行儲存排序關鍵字和行的指標來完成排序。然後關鍵字被排序,並按排序順序檢索行。
use index: 使用索引,不需要操作實際的行來檢索表中的資訊。
using temporary:看到這裡需要優化,一般是又order by or group by 造成的,是由於對非驅動表進行排序。(
對驅動表可以直接排序,對非驅動表(的字段排序)需要對迴圈查詢的合併結果(臨時表)進行排序
(important!)
)user where : where 自居用於限制那乙個行匹配下乙個表或傳送到客戶。
-------------------------------------- explain 參數列-------------------------------------------
idselect識別符。這是select的查詢序列號
select_type
select型別,可以為以下任何一種:
table
輸出的行所引用的表
type
聯接型別。下面給出各種聯接型別,按照從最佳型別到最壞型別進行排序:
possible_keys
指出mysql能使用哪個索引在該表中找到行
key顯示mysql實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是null。
key_len
顯示mysql決定使用的鍵長度。如果鍵是null,則長度為null。
ref顯示使用哪個列或常數與key一起從表中選擇行。
rows
顯示mysql認為它執行查詢時必須檢查的行數。多行之間的資料相乘可以估算要處理的行數。
filtered
顯示了通過條件過濾出的行數的百分比估計值。
extra
該列包含mysql解決查詢的詳細資訊
開啟mysql執行計畫時遇到的問題:
解決辦法:
在my.cnf 裡面設定
sql_mode='strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_auto_create_user,no_engine_substitution'
在sql_mode 中去掉only_full_group_by
mysql執行計畫 MySQL 執行計畫
1.執行計畫的定義 什麼是執行計畫 查詢計畫 呢?執行計畫就是一系列的操作步驟。sql是宣告性語言,它只告訴資料庫要查詢什麼,但並不告訴資料庫如何去查。資料庫所要做的就是基於演算法和統計資訊計算出一條最佳的訪問路徑。這個工作是由優化器來完成的。優化器會比較不同的執行計畫,然後選擇其中最優的一套。2....
mysql 生成執行計畫 MySQL執行計畫
和很多其他關係型資料庫不通,mysql並不會在生成查詢位元組碼來執行查詢。mysql生成查詢的一棵指令樹,然後通過儲存引擎執行完成這棵指令樹並返回結果。最終的執行計畫包含了重構查詢的全部資訊。如果某個查詢執行explain extended 之後,在執行show warnings,就可以看到重構出的...
mysql 查詢執行計畫 MySql執行計畫的檢視
一。什麼是資料庫執行計畫 利用乙個sql語句,你可能要server取出所有news表中的資訊.當server收到的這條sql的時候,第一件事情並不是解析它.如果這條sql沒有語法錯誤,server才會繼續工作.server會決定最好的計算方式.server會選擇,是讀整個news表好呢,還是利用索引...