深入淺出sql的性能優化(二)之索引優化的標尺"Explain"

每天更新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相同,執行順序由上至下

例子

深入淺出sql的性能優化(二)之索引優化的標尺

如圖 ,我們查詢了三張表,他們的id都是1,所以他們的執行順序是由上至下的

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

深入淺出sql的性能優化(二)之索引優化的標尺

如圖 ,我們查詢了三張表id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行

id相同不同,同時存在

深入淺出sql的性能優化(二)之索引優化的標尺

如圖 ,我們查詢了三張表,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各個字段的含義後,我們就要動手建索引了,我們在下一篇文件中詳細介紹

我們會講到

單表使用索引及常見索引失效

關聯查詢優化

子查詢優化

排序分組優化等。


分享到:


相關文章: