資料準備:
create table user (資料說明:id int primary key,
name varchar(20),
*** varchar(5),
index(name)
)engine=innodb;
使用者表:id主鍵索引,name普通索引(非唯一),***無索引;
四行記錄:其中name普通索引存在重覆記錄lisi;
一、【using where】
實驗語句:
explain select * from user where ***='no';
結果說明:
extra為using where說明,sql使用了where條件過濾資料。
需要注意的是:
(1)返回所有記錄的sql,不使用where條件過濾資料,大概率不符合預期,對於這類sql往往需要進行優化;
(2)使用了where條件的sql,並不代表不需要優化,往往需要配合explain結果中的type(連線型別)來綜合判斷;
本例雖然extra欄位說明使用了where條件過濾,但type屬性是all,表示需要掃瞄全部資料,仍有優化空間。
常見的優化方法為,在where過濾屬性上新增索引。
畫外音:本例中,***字段區分度不高,新增索引對效能提公升有限。
二、【using index】
實驗語句:
explain select id,name from user where name='shenjian';
結果說明:
extra為using index說明,sql所需要返回的所有列資料均在一棵索引樹上,而無需訪問實際的行記錄。
這類sql語句往往效能較好。
問題來了,什麼樣的列資料,會包含在索引樹上呢?
三、【using index condition】
實驗語句:
explain select id,name,*** from user
where name='shenjian';
結果說明:
extra為using index condition說明,確實命中了索引,但不是所有的列資料都在索引樹上,還需要訪問實際的行記錄。
這類sql語句效能也較高,但不如using index。
問題來了,如何優化為using index呢?
四、【using filesort】
實驗語句:
explain select * from user order by ***;
結果說明:
extra為using filesort說明,得到所需結果集,需要對所有記錄進行檔案排序。
這類sql語句效能極差,需要進行優化。
典型的,在乙個沒有建立索引的列上進行了order by,就會觸發filesort,常見的優化方案是,在order by的列上新增索引,避免每次查詢都全量排序。
五、【using temporary】
實驗語句:
explain select * from user group by name order by ***;
結果說明:
extra為using temporary說明,需要建立臨時表(temporary table)來暫存中間結果。
這類sql語句效能較低,往往也需要進行優化。
典型的,group by和order by同時存在,且作用於不同的字段時,就會建立臨時表,以便計算出最終的結果集。
六、【using join buffer (block nested loop)】
實驗語句:
explain select * from user where id in (select id from user where ***='no');
結果說明:
extra為using join buffer (block nested loop)說明,需要進行巢狀迴圈計算。
畫外音:內層和外層的type均為all,rows均為4,需要迴圈進行4*4次計算。
這類sql語句效能往往也較低,需要進行優化。
典型的,兩個關聯表join,關聯欄位均未建立索引,就會出現這種情況。常見的優化方案是,在關聯欄位上新增索引,避免每次巢狀迴圈計算。
結尾:explain是sql優化中最常用的工具,搞定type和extra,explain也就基本搞定了。
字首和與差分 Extra
給定乙個 n times m 的矩陣,有 t 次詢問,每次會給出四個數 a,b,c,d 求以點 a,b 為左上角,點 c,d 為右下角的矩形所有元素和。1 le n,m le 3000 1 le t le 10 6 我們先把問題變簡單 如何用二維字首和求出整個矩陣的和?觀察一維遞推式 s i s a...
Mysql執行計畫 Extra列解析
mysql的執行計畫中,其他的列都比較好理解,唯獨這個extra列,總是看得有點讓人似懂非懂,先終於找了個機會自己研究了下。using index 中文名叫做索引覆蓋查詢 如果查詢的時候,用到了索引,並且你最終需要的資料也是這個索引的一部分,那麼就出現using index.例如 user表有索引 ...
Mysql常見優化技巧
mysql基礎打牢以後,優化就是一大難題。如何優化資料庫呢?這也是面試常見的問題,除了新增索引以外,我們還需要從這些方面考慮 1 sql語句和索引 程式猿常常考慮的難題 2 資料庫表結構 資料結構設計 3 系統配置 4 硬體 硬體和系統配置不做介紹,先簡單介紹一下mysql常見效能優化技巧 mysq...