sql優化學習筆記之EXPLAIN詳解

2021-09-10 02:43:08 字數 2805 閱讀 9437

建立一張表

善用explain檢視執行計畫

這裡我們需要關注的資料有:

type列,key列,key_len列,rows列,extra列

1、type列

這裡的type官方全稱是「join type」,意思為連線型別,它更確切的說是一種資料庫引擎查詢表的一種方式,在《高效能mysql》一書中作者更是覺得稱呼它為訪問型別更貼切一些。mysql5.7中type的型別達到了14種之多,這裡只記錄和理解最重要且經常遇見的六種型別,它們分別是all,index,range,ref,eq_ref,const。從左到右,它們的效率依次是增強的。撇開sql的具體應用環境以及其他因素,你應當盡量優化你的sql語句,使它的type盡量靠右,但實際運用中還是要綜合考慮各個方面的。乙個好的sql語句至少要達到range級別。杜絕出現all級別。

all:全表掃瞄,最原生的狀態,有很大的優化空間 

此時表沒有新增索引

index:這種連線型別只是另外一種形式的全表掃瞄,只不過它的掃瞄順序是按照索引的順序。這種掃瞄根據索引然後回表取資料,和all相比,他們都是取得了全表的資料,而且index要先讀索引而且要回表隨機取資料,因此index不可能會比all快(取同乙個表資料),但為什麼官方的手冊將它的效率說的比all好,唯一可能的原因在於,按照索引掃瞄全表的資料是有序的。這樣一來,結果不同,也就沒法比效率的問題了。

如果一定要比效率,只需要獲取這個表的資料並且排序便可以看出來誰比誰效率高了:

range:range指的是有範圍的索引掃瞄,相對於index的全索引掃瞄,它有範圍限制,因此要優於index。關於range比較容易理解,需要記住的是出現了range,則一定是基於索引的。同時除了顯而易見的between,and以及'>','

ref:出現該連線型別的條件是: 查詢條件列使用了索引而且不為主鍵和unique。其實,意思就是雖然使用了索引,但該索引列的值並不唯一,有重複。這樣即使使用索引快速查詢到了第一條資料,仍然不能停止,要進行目標值附近的小範圍掃瞄。但它的好處是它並不需要掃全表,因為索引是有序的,即便有重複值,也是在乙個非常小的範圍內掃瞄。下面為了演示這種情形,給employee表中的name列新增乙個普通的key(值允許重複)

此時給列v2加上普通索引(值允許重複)

eq_ref:ref_eq 與 ref相比牛的地方是,它知道這種型別的查詢結果集只有乙個?什麼情況下結果集只有乙個呢!那便是使用了主鍵或者唯一性索引進行查詢的情況。多在基於唯一索引的連表查詢的時候出現,這可能是最好的聯接型別。

const:通常情況下,如果將乙個唯一索引(主鍵也是乙個特殊的唯一索引)放置到where後面作為條件查詢,mysql優化器就能把這次查詢優化轉化為乙個常量。至於如何轉化以及何時轉化,這個取決於優化器。

2、key列,使用到的索引名。如果沒有選擇索引,值是null。要讓mysql強行使用或者忽略在 possible_keys欄位中的索引列表,可以在查詢語句中使用關鍵字force index, use index,或 ignore index

3、key_len列,顯示了mysql使用索引的長度。當 key 欄位的值為 null時,索引的長度就是 null。注意,key_len的值可以告訴你在聯合索引中mysql會真正使用了哪些索引。

4、rows列,掃瞄行數。這個數表示mysql要遍歷多少資料才能找到,在innodb上是不準確的,是個預估值。

5、extra列,詳細說明。如果是only index,這意味著資訊只用索引樹中的資訊檢索出的,這比掃瞄整個表要快。

如果是where used,就是使用上了where限制。

如果是impossible where 表示用不著where,一般就是沒查出來啥。

注意,常見的不太友好的值,如下:using filesort,using temporary,意思為where和order by的索引經常無法兼顧,如果按照where來確定索引,那麼在order by時,就必然會引起using filesort,這就要看是先過濾再排序划算,還是先排序再過濾划算。

using filesort

mysql需要額外的一次傳遞,以找出如何按排序順序檢索行。

using temporary

為了解決查詢,mysql需要建立乙個臨時表來容納結果。

MySQL 之 SQL 語句優化學習

查詢正在執行的任務列表 show full processlist g.生成乙個查詢執行計畫 query execution plan qep 一般情況下,每條sql語句都可以執行 explain 對於 update 和 delete 需要轉化為相應的 select 語句以確保有效使用索引顯示表的建...

sql優化學習記錄

面試被問到了sql優化,回來學習一下,看別人的文章,自己在手動記錄一遍,算是加深印象吧。所謂sql優化,本質上有三種選擇 1 降低目標sql語句的資源消耗 2 並行執行目標sql語句 3 平衡系統的資源消耗 以上的說明比較難理解,還是記錄一些簡單易懂的方法 1 對查詢進行優化,避免全表查詢。2 避免...

mysql優化學習筆記

定位執行效率低的sql語句 通過explain分析效率低的sql 通過show profile分析sql 通過trace分析優化器如何選擇執行計畫 確定問題,採取措施優化 匹配全值,條件所有列都在索引中而且是等值匹配 匹配值的範圍查詢,字段必須在索引中 匹配最左字首,復合索引只會根據最左列進行查詢 ...