MySQL 優化之 EXPLAIN 關鍵字

2021-08-08 11:02:03 字數 2355 閱讀 3457

mysql查詢優化之explain的深入解析

首先執行如下的 sql 語句:

create

table

ifnot

exists

`article` (`id`

int(10) unsigned not

null auto_increment,

`author_id`

int(10) unsigned not

null,

`category_id`

int(10) unsigned not

null,

`views`

int(10) unsigned not

null,

`comments`

int(10) unsigned not

null,

`title` varbinary(255) not

null,

`content` text not

null,

primary

key (`id`)

);insert

into

`article`

(`author_id`, `category_id`, `views`, `comments`, `title`, `content`) values

(1, 1, 1, 1, '1', '1'),

(2, 2, 2, 2, '2', '2'),

(1, 1, 3, 3, '3', '3');

想要查詢 category_id 為 1 且 comments 大於 1 的情況下,views 最多的 article_id。

語句如下(在傳統的查詢語句前加上 explain 關鍵字):

explain

select author_id

from

`article`

where category_id = 1

and comments > 1

order

by views desc

limit 1;

給出如下的查詢結果:

id:

1select_type: ******

table: article

type: all

possible_keys: null

key: null

key_len: null

ref: null

rows:

3extra: using where; using filesort

1 row in

set (0.00

sec)

mysql 查詢優化器有幾個目標,但是其中最主要的目標是盡可能地使用索引,並且使用最嚴格的索引來消除盡可能多的資料行。

table:輸出行所引用的表

extra:中出現以下 2 項意味著 mysql 根本不能使用索引,效率會受到重大影響。應盡可能對此進行優化。using temporary:表示 mysql 在對查詢結果排序時使用臨時表。常見於排序 order by 和分組查詢 group by。

如果 explain 的輸出結果中,type 對應的是 all,extra 還出現了 using filesort,都意味著 sql 語句雖然能夠工作,但其實是最壞的,並沒有合理使用的 sql 查詢語句。

alter

table

`article`

add index x ( `category_id` , `comments`, `views` );

新增 index 索引之後,再次呼叫 explain 語句,可以看到,type 變成了range,這是可以忍受的。但是 extra 裡使用 using filesort 仍是無法接受的。也即並未使用上面建立的索引。這是因為按照 btree 索引的工作原理,先排序 category_id,如果遇到相同的 category_id 則再排序 comments,如果遇到相同的 comments 則再排序 views。當 comments 欄位在聯合索引裡處於中間位置時,因comments > 1 條件是乙個範圍值,mysql 無法利用索引再對後面的 views 部分進行檢索,即 range 型別查詢字段後面的索引無效。

drop index x on article;

alter

table

`article`

add index y ( `category_id` , `views` ) ;

mysql效能優化之EXPLAIN

mysql效能分析及explain用法的知識是本文我們主要要介紹的內容,接下來就讓我們通過一些實際的例子來介紹這一過程,希望能夠對您有所幫助。1.使用explain語句去檢視分析結果 如explain select from test1 where id 1 會出現 id selecttype ta...

MySQL效能優化之explain

在日常工作中,我們會有時會開慢查詢去記錄一些執行時間比較久的sql語句,找出這些sql語句並不意味著完事了,些時我們常常用到explain這個命令來檢視乙個這些sql語句的執行計畫,檢視該sql語句有沒有使用上索引,有沒有做全表掃瞄,這都可以通過explain命令來檢視。所以我們深入了解mysql的...

mysql優化之EXPLAIN語句

explaintbl name 或 explain extended selectselect options explain語句可以用作describe的乙個同義詞,或獲得關於mysql如何執行select語句的資訊 借助於這個語句,我們也可以分析出,索引對於查詢的作用,以及何時應該可以資料表新增...