sql sever 中如何查看某个表的索引_查看执行计划:explain的type
type顯示訪問類型,較為重要。通過它可以了解我們的SQL語句是否優化過、是否達到最佳的效果。
它的值有很多,從最好到最差比較如下:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
以下幾個是常見的(從最好到最差):
system > const > eq_ref > ref > range > index > All
一般而言,我們要保證查詢至少達到ranag級別,最好能到達到ref。
分別了解一下幾個常見的值的涵義。
system
表只有一行記錄,這種情況平時一般不會出現,可以忽略。
const
表示通過索引一次就找到了,用于比較主鍵或唯一鍵索引。因為只匹配一行數據,所以很快。比如將主鍵置于where列表中,MySQL就能將該查詢轉換為一個常量。
如:explain select * from (select * from emp where id = 1)x;
FROM后的子查詢,所以select_type為DERIVED,第2行結果的id值較大,所以優先執行。emp表中id是主鍵,id=1即只匹配一行數據,所以type的值為const。同時,外層查詢從臨時表x中查詢全部,由于x中只有一行數據,所以type值是system。
eq_ref
唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或唯一鍵索引掃描。type的值是eq_ref的查詢中用到了索引,但查詢只有一條記錄匹配。
用兩個表簡單測試
test1表:
test2表
有以下SQL:
explain select * from test1 t1 ,test2 t2 where t1.id = t2.id;
看其執行計劃
t2的type值是ALL,即全表搜索,t1為eq_ref。兩表id字段為主鍵,t1.id=t2.id條件下只一行數據是符合的。
ref
非唯一性索引掃描,返回匹配某個單獨值的所有行。本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會得到多個符合條件的行,所以它應該屬于查找和掃描的混合體。
實例
emp表的數據
在這個表上用job和deptNo字段創建一個復合索引
mysql> create index index1 on emp(job,deptNo);Query OK, 10 rows affected (0.59 sec)
現在要查找deptNo=1的數據(deptNo和job是復合索引,但只使用了一半)
返回了兩行,再看一下執行計劃:
匹配deptNo=1的值的結果有兩行。
現在把索引刪除
drop index index1 on emp;
假設emp表的deptNo是test2的id。有以下sql
select * from emp e , test2 t2 where e.deptNo = t2.id;
我們知道結果有兩行,其執行計劃如下:
emp表的查詢type是ref,因為test2表只有一行數據,所有就類似于匹配detpNo的單獨的值行。
rang
只搜索給定范圍的行。一般就是你在where語句中出現between、、in等查詢這種范圍掃描,比全表掃描要好,因為它只需要開始于索引的某一個點,而結束另一點,不用掃描全部索引。如以下SQL
select * from emp where id in (1,2);
能夠達到rang已經可以了。
index和ALL
index和ALL都是讀全表,兩者區別在于index類型只遍歷索引樹,通常比ALL快。
如以下兩條SQL:
select id from emp;
select id ,ename from emp;
explain查看如下:
若SQL能達不到rang或以上的話,能達到index也可以。
關于type介紹到此,主要是要了解它的值所代表的涵義,好壞的排列,那我們就可以知道SQL的優劣,以及優化是否有效果。
總結
以上是生活随笔為你收集整理的sql sever 中如何查看某个表的索引_查看执行计划:explain的type的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 薰衣草茶的功效与作用、禁忌和食用方法
- 下一篇: 青萝卜汤的功效与作用、禁忌和食用方法