explain語句可以獲得關於mysql如何執行select語句的資訊,借助於explain,可以知道什麼時候必須為表加入索引以得到乙個使用索引來尋找記錄的更快的select。
explain [extended] select select_options
示例用到的原始表如下:
表中的索引如下圖所示:
執行如下的查詢,使用 explain 獲取語句的執行計畫:
explain
extended
select
*from test_table where id =
1union
select
*from test_table where id =
2
得到的執行計畫如下圖所示:
id是 select 的查詢序列號。id相同時執行順序由上到下,id不同時,先執行id大的查詢,id為null表示查詢結果集。
select_type是查詢型別,有如下取值:
1.******:簡單查詢(不使用union或子查詢)。
2.primary:包含子查詢時,最外層的查詢。
3.union:union中的第二個或後面的select語句。
4.union result:union的結果集。
5.subquery:子查詢中的第乙個查詢。
6.dependent subquery:子查詢中的第乙個查詢,取決於外面的查詢。
7.derived:匯出表的select(from子句的子查詢)。
table是查詢輸出的行所引用的表,如果表存在別名,那麼這裡顯示的是表的別名。
partitions是表的分割槽資訊。
type是聯接型別。下面給出各種聯接型別,按照效能從高到低進行排序:
1.system:表僅有一行(=系統表)。這是const聯接型別的乙個特例。
2.const:表最多有乙個匹配行,它將在查詢開始時被讀取。因為僅有一行,在這行的列值可被優化器剩餘部分認為是常數。const 表很快,因為它們只讀取一次。const 用於用常數值比較primary key或unique索引的所有部分時。
3.eq_ref:索引的所有部分被聯接使用,並且索引是unique或primary key。eq_ref 可以用於使用 = 操作符比較的帶索引的列,比較值可以為常量或乙個使用在該錶前面所讀取的表的列的表示式。
4.ref:使用的索引不是unique或primary key。ref可以用於使用=或<=>操作符的帶索引的列。
5.ref_or_null: 該聯接型別如同ref,但是新增了mysql可以專門搜尋包含null值的行。
6.index_merge: 該聯接型別表示使用了索引合併優化方法。
7.unique_subquery: 在 in 子查詢中使用 eq_ref 。
8.index_subquery: 在 in 子查詢中使用 ref 。
9.range: 使用乙個索引來選擇行,只檢索給定範圍的行。
10.index: 遍歷索引全部取值。
11.all: 進行全表掃瞄。
possible_keys表示查詢過程中可能使用的索引。
key表示查詢過程實際使用的索引。
key_len表示查詢所使用的索引的長度。
ref顯示使用哪個列或常數與索引一起從表中進行查詢。
rows顯示執行查詢時必須掃瞄的行數,不一定是實際值。
通過 explain 語句,可以檢視查詢的詳細資訊,分析在什麼時候可以新增索引,以提高查詢效率。
SQL執行計畫 02 通過執行計畫優化sql
1 where子句的查詢條件中,如果是範圍查詢那麼索引列的值 是走索引的 和 是不走索引的 舉例 age列有普通索引 select from test table where age 100 走索引 select from test table where age 100 不走索引 2 盡量使用主鍵...
Sql優化 執行計畫
一段sql 寫好以後,可以通過檢視sql的執行計畫,初步 該sql在執行時的效能好壞,尤其是在發現某個sql語句的效率較差時,我們可以通過檢視執行計畫,分析出該sql 的問題所在。1 開啟熟悉的檢視工具 pl sql developer。在pl sql developer中寫好一段sql 後,按f5...
sql優化過程 執行計畫
1 什麼是sql執行計畫 sql執行計畫,就是一條sql語句,在資料庫中實際執行的時候,一步步的分別都做了什麼。就是我們用explain分析一條sql語句時展示出來的那些資訊 2 sql執行計畫的作用 sql執行計畫的意義就在於我們可以通過執行計畫更加清晰的認識到這一條語句,分為了哪幾步,有沒有用到...