MySQL優化常見Extra分析 慢查詢優化

2021-10-21 20:15:59 字數 2622 閱讀 9872

資料準備:

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...