mysql 執行計畫

2021-09-28 23:55:07 字數 2529 閱讀 7490

sql執行計畫,就是一條sql語句,在資料庫中實際執行的時候,一步步的分別都做了什麼。就是我們用explain分析一條sql語句時展示出來的那些資訊

了解sql執行計畫的意義就在於我們可以通過執行計畫更加清晰的認識到這一條語句,分為了哪幾步,有沒有用到索引,是否有一些可優化的地方等。

實際執行乙個explain時候,我們都能看到下面的這個表頭

idselect_type

table

type

possible_keys

keykey_len

refrows

extra

select 查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序

id相同:執行順序由上而下

id不同:如果是子查詢,id的序號會遞增,id值越大優先順序越高,越先被執行

id有相同有不同:id相同的認為是一組,從上往下執行,id不同的,值越大越先執行

查詢的型別,主要用於區分普通查詢、聯合查詢、子查詢等複雜的查詢

******:簡單的select查詢,查詢中不包含子查詢或者uninon

primary:查詢中包含任何複雜的子部分,最外層查詢則被標記為primary

subquery:在select或where列表中包含了子查詢

derived:在from列表中包含的子查詢被標記為derived,mysql或遞迴執行這些子查詢,把結果放在零時表裡

union:若第二個select出現在union之後,則被標記為union,若union包含在from子句的子查詢中,外層select將被標記為derived

uion result:從uion表獲取結果的select

訪問型別,sql查詢優化中乙個很重要的指標。

system:表只有一行記錄(等於系統表),這是const型別的特例

const:表示通過索引一次就找到了,const用於比較primary key或者unique索引。如果將主鍵置於where列表中,mysql就能將該查詢轉換為乙個const

eq_ref:唯一索引掃瞄,常見於主鍵或唯一索引

ref:非唯一索引掃瞄,返回匹配某個單獨值的所有行

range:一般就是在where語句**現了bettween、、in等的查詢

index:只遍歷索引樹

all:遍歷全表

查詢涉及到的字段上存在索引,則該索引將被列出,但不一定被查詢實際使用

實際使用的索引,如果為null,則沒有使用索引

表示索引中使用的位元組數,查詢中使用的索引的長度(最大可能長度),並非實際使用長度,理論上長度越短越好。

顯示索引的哪一列被使用了,如果可能,是乙個常量const

根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數

不適合在其他欄位中顯示,但是十分重要的額外資訊

using filesort:對資料使用乙個外部的索引排序,而不是按照表內的索引進行排序讀取

using temporary:使用臨時表儲存中間結果,也就是說mysql在對查詢結果排序時使用了臨時表,常見於order by和group by

using index:表示相應的select操作中使用了覆蓋索引

using where:使用了where過濾

using join buffer:使用了鏈結快取

impossible where:where 子句的值總是false,不能用來獲取任何元組

select tables optimized away:比如count(*)操作,不必等到執行階段再進行計算,查詢執行計畫生成的階段即可完成優化

distinct:優化distinct操作,在找到第乙個匹配的元組後即停止找同樣值

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表好呢,還是利用索引...