mysql 多key索引_MYSQL的EXPLAIN到底多好用?
工欲善其事必先利其器!
作為一名程序員,免不了要和MYSQL打交道。而在這過程中,就不得不面對性能優化這一大課題。
而在性能優化中,EXPLAIN就是能夠幫助我們查看SQL執行計劃是否優化的一個工具。
今天,我們就基于一個案例來看看EXPLAIN的神奇作用。
一、具體案例
我們來執行一條非常簡單的代碼:
expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;
執行之后的結果如下:
發現出來了很多的字段,這么多字段其實也沒必要每個都重點關注,上面圖片用紅色框框標出了5個字段,這些是需要重點關注的。下面具體來說說這5個字段的含義。
1.type
表示訪問表的方式,一共有6種。
從最好到最差的結果依次如下:
system > const > eq_ref > ref > range > index > ALL
注意:一個好的SQL語句至少要達到range級別!杜絕出現all級別。
system: 表示結果集僅有一行;
const: 表示通過主鍵或者唯一鍵查找數據時只匹配最多一行數據;
eq_ref: 該類型多出現在多表join場景,通過主鍵或者唯一鍵訪問表;
對于前表b的每行記錄,都只能匹配到后表a的一行記錄并且查詢的比較操作通常是=,查詢效率較高。
ref: 此類型通常出現在sql使用非唯一或非主鍵索引, 或者是使用最左前綴規則索引的查詢;
range: 表示where條件使用索引范圍查詢,當 type 是 range 時,ref 字段為 NULL。
index: 表示全索引掃描, 掃描所有的索引記錄, 而不掃描數據;
index 類型通常會出現在覆蓋索引中,所要查詢的數據直接在索引中就可以訪問, 而不用回表掃描數據。 此時Extra 字段 會顯示 Using index。還有一種是全表掃描時通過索引順序訪問數據。此時并不會在Extra提示 using index。
ALL: 表示執行計劃選擇全表掃描,當執行計劃出現type 為all 時,我們盡量通過修改索引的方式讓查詢利用索引。
2.key
此字段是 MySQL 在當前查詢時所使用到的索引。
如果沒有選擇索引,值是NULL。
可以采取強制索引方式。
3.key_len
key_len表示執行計劃所選擇的索引長度有多少字節,通常我們可借此判斷聯合索引有多少列。
key_len 大小的計算規則是:
一般地,key_len 等于索引列類型字節長度,例如int類型為4 bytes,bigint為8 bytes;如果是字符串類型,還需要同時考慮字符集因素,例如:CHAR(30) UTF8則key_len至少是90 bytes;若該列類型定義時允許NULL,其key_len還需要再加 1 bytes;若該列類型為變長類型,例如 VARCHAR(TEXT\BLOB不允許整列創建索引,如果創建部分索引也被視為動態列類型),其key_len還需要再加 2 bytes。
4.rows
表示的是掃描行數。
記住:該值是個預估值,所以并非是完全準確的值。
MySQL 查詢優化器根據統計信息,估算 SQL 要查找到結果集需要掃描讀取的數據行數。
原則上 rows 越少越好。
5.extra
該列會提示優化執行計劃的額外的信息。
注意,常見的不太友好的、值得大家關注的有如下幾種:
Using index。表示該sql利用覆蓋索引掃描,也即從只訪問索引即可獲取到所需的數據,而不用回表。
Using where。表示該sql 回表獲取數據了。什么是回表呢? 其實就是僅僅通過訪問索引不能滿足獲取所需的數據,需要訪問表的page 頁。
如果和Using index 同時出現,說明where條件通過索引定位數據,然后回表,再過濾所需要的數據。
Using filesort。說明排序沒有利用索引而發生了額外排序 ,伴隨著的可能還有Using temporary。
其實還有其他一些 提示Using MRR、Using index condition 、Using index for group-by,這些提示是正向的,說明sql比較優化。
6.其它字段
前面講了5個比較重要的字段,相信很多求知欲強的小伙伴也想知道其它字段是什么意思,這里也一并列出來,以供參考:
字段
含義
查詢語句的序號或者說是標識符
select_type
表是查詢的類型,常見的有如下6種
table
其值為表名或者表的別名,表示訪問哪一個表
partitions
匹配的分區
possible_keys
表示查詢時,可能使用的索引
filtered
按表條件過濾的行百分比
二、總結
本文基于一個最為簡單的案例講解了explain的執行結果,最為重要的是5個字段,其它字段了解含義即可,希望對您有用~
總結
以上是生活随笔為你收集整理的mysql 多key索引_MYSQL的EXPLAIN到底多好用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的如何输入dateadd_my
- 下一篇: mysql 问号作用_什么是MySQL中