SQL2

優(yōu)化實例

創(chuàng)建一個表格

create table test03(
  a1 int(4) not null,
  a2 int(4) not null,
  a3 int(4) not null,
  a4 int(4) not null

);
alter table test03 add index idx_a1_a2_a3_a4(a1,a2,a3,a4);

寫語句

explain select a1,a2,a3,a4 from test03 where a1=1 and a2=2 and a3=3 and a4=2;

理想情況下


索引和執(zhí)行的順序一樣

where 和符合索引的順序一樣抵卫。

explain select a1,a2,a3,a4 from test03 where a4=1 and a3=2 and a2=3 and a1=2;

不推薦缠诅!運氣好而已

sql優(yōu)化

有一個SQL優(yōu)化器幫你改完之后二者是等價的

//4是無效查詢,所以要using where
//a4需要回表查詢
explain select a1,a2,a3,a4 from test03 where a1=1 and a2=2 and a4=3  order by a3;
沒有filesort

拼起來還是有序的1 2 3


explain select a1,a2,a3,a4 from test03 where a1=1 and a4=3  order by a3;
出現(xiàn)了跨列使用

拼起來不是1 2 3

//理論上不會的
explain select a1,a2,a3,a4 from test03 where a1=1 and a4=3  order by a2, a3;
拼起來了1 2 3

where 和order by

where后面要和索引順序一致,不一致的話,后面部分會失效,用orderby語句和列平起來后還是順序的也是可以的

案例

單表優(yōu)化

1 創(chuàng)建一個表格

create table book(
bid int(4) primary key,
name varchar(20) not null,
authorid int(4) not null,
publicid int(4) not null,
typeid int(4) not null
);
insert into book values(1,'java',1,1,2);
insert into book values(2,'javaScrip',2,3,4);
insert into book values(3,'wx',3,5,7);
insert into book values(4,'C++',4,6,1);
commit;

查詢authorid=1typeid為2或3的bid

explain select bid from book where typeid in(2,3) and authorid=1 order by typeid desc;
待優(yōu)化語句

type=all extra是using filesort

優(yōu)化:加索引

alter table book add index idx_bta(bid,typeid,authorid);


優(yōu)化了一點

根據(jù)sql實際解析的順序航夺,調(diào)整索引的順序

--索引一旦廢棄優(yōu)化,要刪除舊的索引
drop index idx_bta on book;
--雖然可以回表崔涂,但是加入可以使用using index阳掐;
alter table book add index idx_atb(authorid,typeid,bid);

再次優(yōu)化(之前是index)

//范圍查詢in有時候會失效,所以可以調(diào)整范圍查詢在后面
explain select bid from book where authorid=1 and typeid in(2,3) order by typeid desc;
優(yōu)化結(jié)果

--小結(jié)

  • 最佳做前綴冷蚂,索引不能跨列使用缭保,保持索引的定義和使用順序一致
  • 索引需要多部優(yōu)化
  • 將in查詢放到where條件的最后,防止失效
  • authroid在索引里面蝙茶,不需要回原表艺骂,但是in會使得typeid失效

多表優(yōu)化

創(chuàng)建表格

create table teacher2(
tid int(4) primary key,
cid int(4) not null
);
insert into teacher2 values(1,2);
insert into teacher2 values(2,1);
insert into teacher2 values(3,3);

create table course2(
cid int(4) primary key,
cname varchar(20)
);
insert into course2 values(1,'java');
insert into course2 values(2,'python');
insert into course2 values(3,'cotlin');
commit;

兩表關聯(lián)左連接

select * from teacher2 t left outer join course2 c on t.cid=c.cid where c.cname='java';
小表:10
大表:300
for(int i=0;i<小表.length;i++){
for(int j=0;j<大表.length;j++){
        。隆夯。钳恕。
}
}

for(int i=0;i<大表.length;i++){
for(int j=0;j<小表.length;j++){
        。蹄衷。忧额。
}
}
一般建議外層循環(huán)應該小,內(nèi)存循環(huán)應該大


想加索引where 小表.x = 大表.x;

alter table teacher2 add index index_teacher2_cid(cid);
alter table course2 add index index_course2_cname(cname);

左表加上索引愧口,cname也加上索引

建議

  • 當編寫on t.cid =c.cid的時候宙址,應該是將數(shù)據(jù)量小的表放在左邊
  • 索引應該放在經(jīng)常使用的字段上,因此將x字段加上索引调卑,一般是放在左邊的表加索引

三表優(yōu)化

a. 小表驅(qū)動大表
b. 索引建立在索引經(jīng)常查詢的字段上

避免索引失效的一些原則

  • 符合索引的時候,不要跨列或無序使用
 index:(a,b,c)
where a... and c... order by c
  • 盡量使用全索引匹配
//所有索引都要用
 index:(a,b,c)
where a... and c... order by c
如果a失效了b和c失效
  • 不要再索引上進行任何操作(會失效)
    計算大咱,函數(shù)恬涧,類型轉(zhuǎn)換,否則索引失效
select ... where A.x =
//不要
select ... where 3*A.x =

select * from book where authroid=1 and typeid=2;

索引進行操作了碴巾,失效K堇Α!厦瓢!
  • 復合索引不能使用 提揍!= 或者is null,否則自身和右側(cè)索引全部失效
  • 實際使用有沒有SQL優(yōu)化煮仇,但是實際上可能只有一個劳跃,優(yōu)化是一個概率層面的。

體驗一下概率事件

sql優(yōu)化器是一個概率上的事件

  • 有大于號可能也會失效
  • 大部分情況都適用浙垫,但是sql優(yōu)化器等原因刨仑,所以不是百分百的確定郑诺,范圍查詢之后的索引失效(> < in)
  • 補救。盡量使用索引覆蓋 using index杉武,這個條件永遠成立辙诞。
  • like盡量用常量開頭,不要用%開頭轻抱,否則索引失效飞涂。如果必須使用模糊查詢,可以使用索引覆蓋進行挽救
explain select tname from teacher where tname like '%x%';
索引覆蓋
  • 盡量不要使用類型轉(zhuǎn)換
    程序底層可能會將123 -> '123'祈搜,索引失效
  • 盡量不要使用or较店,否則失效


    使用or索引失效

具體的優(yōu)化方法

exists和in
如果主查詢的數(shù)據(jù)很大,使用in
如果子查詢的數(shù)據(jù)很大夭问,使用exist泽西,校驗是否有數(shù)據(jù)

(前面大用)
select * from teacher where tname in (select id from teacher);
(后面大用exists)
select tname from teacher where exists (select * from teacher);

order by優(yōu)化

經(jīng)常看到using filesort缰趋,有兩種算法:雙路排序捧杉、單路排序
之前的是雙路排序
(讀取磁盤數(shù)據(jù),進行排序buffer上)

雙路排序

(只用讀取一次秘血,將所有字段在buffer上面進行排序)
默認的是單路排序
如果數(shù)據(jù)量太大味抖,會進行分片讀取
注意:單路排序非常消耗buffer,如果數(shù)據(jù)量太大灰粮,可以調(diào)大buffer的大小

set max_length_for_sort_data=1024;

如果buffer太低仔涩,就會使得單路 變成雙路

  • 選擇單路,調(diào)整buffer大小
  • select a粘舟,b from 不要用*
  • 復合索引熔脂,不要跨列使用
  • 保證排序的一致性(都是升序或者降序)

sql排序-慢查詢?nèi)罩荆簃ysql提供的日志記錄,用戶記錄響應超過閾值的sql語句柑肴,慢查詢?nèi)罩鞠既啵J是關閉的,開發(fā)的時候可以打開

show variables like '%slow_query_log%';

開啟晰骑,臨時開啟:

set global slow_query_log = 1;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末适秩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子硕舆,更是在濱河造成了極大的恐慌秽荞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抚官,死亡現(xiàn)場離奇詭異扬跋,居然都是意外死亡,警方通過查閱死者的電腦和手機凌节,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門胁住,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趁猴,“玉大人,你說我怎么就攤上這事彪见±芩荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵余指,是天一觀的道長捕犬。 經(jīng)常有香客問我,道長酵镜,這世上最難降的妖魔是什么碉碉? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮淮韭,結(jié)果婚禮上垢粮,老公的妹妹穿的比我還像新娘。我一直安慰自己靠粪,他們只是感情好蜡吧,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著占键,像睡著了一般昔善。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畔乙,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天君仆,我揣著相機與錄音,去河邊找鬼牲距。 笑死返咱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牍鞠。 我是一名探鬼主播洛姑,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼皮服!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起参咙,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤龄广,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蕴侧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體择同,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年净宵,在試婚紗的時候發(fā)現(xiàn)自己被綠了敲才。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裹纳。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖紧武,靈堂內(nèi)的尸體忽然破棺而出剃氧,到底是詐尸還是另有隱情,我是刑警寧澤阻星,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布朋鞍,位于F島的核電站,受9級特大地震影響妥箕,放射性物質(zhì)發(fā)生泄漏滥酥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一畦幢、第九天 我趴在偏房一處隱蔽的房頂上張望坎吻。 院中可真熱鬧,春花似錦宇葱、人聲如沸瘦真。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗氏。三九已至,卻和暖如春雷逆,著一層夾襖步出監(jiān)牢的瞬間弦讽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工膀哲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留往产,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓某宪,卻偏偏與公主長得像仿村,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兴喂,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354