每天更新java最新最熱技術,對java感興趣的朋友記得關注一下哦。
注意 :這是SQL性能優化第二章,前置內容在上一篇。
今天主要談如何利用索引對SQl進行優化
我們建索引之前需要一個“標尺”,告訴我們怎麼建索引,MySQL給我們提供了一個工具來建索引,它就是“Explain”,我們首先介紹一下“Explain”。
Explain是什麼
使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是
如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸。
知道了是什麼,怎麼用呢,其實他的用法也很簡單,就是Explain + SQL語句。
加了EXPLAIN關鍵字之後,MySQL就不會執行sql而是生成計劃,讓你知道你表的讀取順序,
哪些索引可以使用,數據讀取操作的操作類型,哪些索引被實際使用,表之間的引用,每張表有多少行被物理查詢等等,幫助我們知道怎麼去優化。
\t(Explain + SQL)
mysql> explain select * from t_order;
\t(以下是執行結果)
+----+-------------+---------+------+---------------+------+---------+------+-----
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+-----
| 1 | SIMPLE | t_order | ALL | NULL | NULL | NULL | NULL | 100453 |
+----+-------------+---------+------+---------------+------+---------+------+-----
1 row in set (0.03 sec)
如圖 :就是Explain的用法,是不是看了他生成的結果,看不太懂,別急,接下來我會帶大家深入淺出的分析Explain的各個字段。、
1. id
select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序
id一般只有三種情況
1)id相同,執行順序由上至下
例子
如圖 ,我們查詢了三張表,他們的id都是1,所以他們的執行順序是由上至下的
2)id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行
如圖 ,我們查詢了三張表id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行
id相同不同,同時存在
如圖 ,我們查詢了三張表,id如果相同,可以認為是一組,從上往下順序執行;
在所有組中,id值越大,優先級越高,越先執行
關注點 id號每個號碼,表示一趟獨立的查詢。一個sql 的查詢趟數越少越好。
所以,我們寫sql時,能不用子查詢就不能子查詢。
2. table
顯示這一行的數據是關於哪張表的,就是說明作用
3.type
type顯示查詢使用了何種類型,是較為重要的一個指標,結果值從最好到最壞依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般來說,得保證查詢至少達到range級別,最好能達到ref。如果沒有達到。就要考慮建索引了,這也是我們建索引的一個重要依據,那麼range以上需要建什麼索引, 我們一一講到
range(where後用了between、、in等的查詢,進行了初步篩選)
只檢索給定範圍的行,使用一個索引來選擇行。key 列顯示使用了哪個索引 一般就是在你的where語句中出現了between、、in等的查詢 這種範圍掃描索引掃描比全表掃描要好,因為它只需要開始於索引的某一點,而結束語另一點,不用掃描全部索引。
index(篩選沒用索引)
出現index是sql使用了索引但是沒用通過索引進行過濾,一般是使用了覆蓋索引或者是利用索引進行了排序分組
all(全表搜索)
Full Table Scan,將遍歷全表以找到匹配的行
4.key
實際使用的索引。如果為NULL,則沒有使用索引
查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊
5.key_len(where條件命中字段)
表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。
key_len字段能夠幫你檢查是否充分的利用上了索引
6.rows( 越少越好)
rows列顯示MySQL認為它執行查詢時必須檢查的行數。
知道了Explain各個字段的含義後,我們就要動手建索引了,我們在下一篇文件中詳細介紹
我們會講到
單表使用索引及常見索引失效
關聯查詢優化
子查詢優化
排序分組優化等。
閱讀更多 閒水雜談 的文章