好程式設計師Java學習路線之MySQL的執行計劃

好程式設計師IT發表於2019-08-01

  好程式設計師 Java 學習路線之 MySQL 的執行計劃。什麼是執行計劃? 執行計劃通常是開發者最佳化 SQL 語句的第一步。 MySQL 在解析 SQL 語句時,會生成多套執行方案,然後內部會進行一個成本的計算,然後透過最佳化器選擇一個最優的方案執行,然後根據這個方案會生成一個執行計劃。開發者透過檢視 SQL 語句的執行計劃,可以直觀的瞭解到 MySQL 是如何解析執行這條 SQL 語句的,然後再針對性的進行最佳化。

 

如何檢視 SQL 語句的執行計劃?

         語法:  explain  select 語句 ;

 

執行計劃每個欄位的含義:

        

        id (重要) :主要用來標識 SQL 語句的解析執行順序

            id 相同的情況:  


            id 不同的情況:


            id 相同不同同時存在:


            id null 的情況:

                 比較少見, id null 的部分一定是最後執行的

    

        select_type:主要用來標識當前查詢的型別

            

            mysql 查詢的分類:

                 簡單查詢:沒有子查詢以及 union sql

                 複雜查詢: where select 後面有子查詢

                                from 後面有子查詢

                                 包換 union 關鍵字

        

            SIMPLE :標識當前查詢是一個簡單查詢

                

 

            PRIMARY :如果是一個複雜查詢(子查詢或者 union ),則最外層的 SQL 語句會被標記成這個型別

            SUBQUERY :用來標記一個子查詢( where select

                

                 注意:通常來說被標記成 PRIMARY 的部分,是最後執行的部分

        

            DERIVED :用來標記一個衍生查詢( from 後面的子查詢)

 

            UNION :標記 union 關鍵字後面的查詢部分

            UNION RESULT :標記 union 結果的合併部分

                

 

        type( 重要 ) :用來標識當前這條 SQL 語句是用哪種方式訪問的資料行(最差  ->  最優)

            

            all :表示當前 MySQL 是採用全表掃描的方式訪問的資料行

            index :表示當前是按照全索引掃描的方式訪問所有資料行

            range :表示查詢了索引的某個範圍

            ref :表示查詢了索引的某個值,但是這個值是可能重複的(只會出現在非唯一性索引的欄位上)

            eq_ref :表示查詢了索引的某個值,但是這個值是唯一的(只會出現在主鍵、唯一性索引上,並且需要結合連線查詢)

            const :查詢索引的某個唯一性值, mysql 會將這個條件最佳化成一個常量

            system (正式開發基本不會出現):表示 mysql 可以確定查詢的表結果一定只有一條

            null (效能最好,但是作用不大):表示當前 SQL 語句直接在解析時就能獲得結果,不能去查詢記錄行

 

             注意:通常在實際開發過程中,需要將 SQL 語句最佳化到 range 以上的級別,但是一定要具體問題具體分析,有些時候 all 反而是更好的行為。

 

 

        possible_keys  :用來標記當前這條 SQL 語句可能用上的索引列表

        key (重要) :用來標識當前這個 SQL 語句用上了哪個索引

 

             注意:有可能一個索引出現在 possible_keys 中,但是沒有出現在 key 中;也有可能一個索引出現在 key 中,但是沒有出現在 possible_keys 中。

            explain select * from student force index(idx_age) order by age;

             標識手動設定 MySQL 執行的索引,但是最好不要這麼幹

 

        key_len:標識當前使用到的索引長度,這個值越大,說明越多的條件使用上了索引

 

        rows( 重要 ) :表示當前查詢可能訪問的記錄行數,這個值越小越好,最好顯示 1

            

             注意:通常在實際的最佳化過程中,需要參考 type rows 兩個欄位來決定是否需要進行最佳化。

                 比如 type all ,但是 rows 1 ,這種情況下,其實完全無需最佳化。       

                 比如 type ref,  但是 rows 10W ,那麼這條 sql 語句效能肯定比不上 all - 1

 

        Extra( 重要 ) :表示當前一些額外的資訊顯示的地方

            

            Using index :說明當前的執行計劃用上了覆蓋索引。

            Using temporary :說明當前內部使用了臨時表 ( 分組、排序 )

            Using filesort :說明使用了檔案排序,這個排序有可能在記憶體上排序,也有可能在硬碟上排序,如果是在硬碟上排序,則最好最佳化一下(比如透過索引進行排序)

            Using where :表示使用了過濾條件


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2652486/,如需轉載,請註明出處,否則將追究法律責任。

相關文章