gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

MySql常用查詢優化策略詳解

本篇文章給大家帶來了關于mysql的相關知識,其中主要介紹了關于常用查詢優化的相關問題,下面一起來看一下,希望對大家有幫助。

MySql常用查詢優化策略詳解

程序員必備接口測試調試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設計、調試、文檔、自動化測試工具
后端、前端、測試,同時在線協作,內容實時同步

推薦學習:mysql視頻教程

在程序上線運行一段時間后,一旦數據量上去了,或多或少會感覺到系統出現延遲、卡頓等現象,出現這種問題,就需要程序員或架構師進行系統調優工作了,其中,大量的實踐經驗表明,調優的手段盡管有很多,但涉及到SQL調優的內容仍然是非常重要的一環,本文將結合實例,總結一些工作中可能涉及到的SQL優化策略;

查詢優化

可以說,對于大多數系統來說,讀多寫少一定是常態,這就表示涉及到查詢的SQL是非常高頻的操作;

前置準備,給一張測試表添加10萬條數據

使用下面的存儲過程給單表造一批數據,將表換成自己的就好了

create procedure addMyData()  	begin  		declare num int; 		set num =1; 		 		while num <= 100000 do 		 			insert into XXX_table values( 				replace(uuid(),'-',''),concat('測試',num),concat('cs',num),'123456' 			);   			set num =num +1; 		end while;  	end ;
登錄后復制

然后調用該存儲過程

call addMyData();
登錄后復制

本篇準備了3張表,分別為學生(student)表,班級(class)表,賬戶(account)表,各自有50萬,1萬和10萬條數據用于測試;

MySql常用查詢優化策略詳解

MySql常用查詢優化策略詳解

1、分頁查詢優化

分頁查詢是開發中經常會遇到的,有一種情況是,當分頁的數量非常大的時候,查詢的時候往往非常耗時,比如查詢student表,使用下面的sql查詢,耗時達到0.2秒;

MySql常用查詢優化策略詳解

實踐經驗告訴我們,越往后,分頁查詢效率越低,這就是分頁查詢的問題所在, 因為,當在進行分頁查詢時,如果執行 limit 400000,10 ,此時需要 MySQL 排序前4000 10 錄,僅僅返回400000 – 4 00010 的記錄,其他記錄丟棄,查詢排序的代價非常大

優化思路:

一般分頁查詢時,通過創建 覆蓋索引 能夠比較好地提高性能,可以通過覆蓋索引加子查詢形式進行優化;
1) 在索引上完成排序分頁操作,最后根據主鍵關聯回原表查詢所需要的其他列內容

SELECT * FROM student t1,(SELECT id FROM student ORDER BY id LIMIT 400000,10) t2 WHERE t1.id =t2.id;

執行上面的sql,可以看到響應時間有一定的提升;

MySql常用查詢優化策略詳解

2)對于主鍵自增的表,可以把Limit 查詢轉換成某個位置的查詢

select * from student where id > 400000 limit 10;

執行上面的sql,可以看到響應時間有一定的提升;

MySql常用查詢優化策略詳解

2、關聯查詢優化

在實際的業務開發過程中,關聯查詢可以說隨處可見,關聯查詢的優化核心思路是,最好為關聯查詢的字段添加索引,這是關鍵,具體到不同的場景,還需要具體分析,這個跟mysql的引擎在執行優化策略的方案選擇時有一定關系;

2.1 左連接或右連接

下面是一個使用left join 的查詢,可以預想到這條sql查詢的結果集非常大

select t.* from student t left join class cs on t.classId = cs.id;
登錄后復制

為了檢查下sql的執行效率,使用explain做一下分析,可以看到,第一張表即left join左邊的表student走了全表掃描,而class表走了主鍵索引,盡管結果集較大,還是走了索引;

MySql常用查詢優化策略詳解

針對這種場景的查詢,思路如下:

  • 讓查詢的字段盡量包含在主鍵索引或者覆蓋索引中;
  • 查詢的時候盡量使用分頁查詢;

MySql常用查詢優化策略詳解

關于左連接(右連接)的explain結果補充說明

  • 左連接左邊的表一般為驅動表,右邊的表為被驅動表;
  • 盡可能讓數據集小的表作為驅動表,減少mysql內部循環的次數;
  • 兩表關聯時,explain結果展示中,第一欄一般為驅動表;

2.2 關聯查詢關聯的字段建立索引

看下面的這條sql,其關聯字段非表的主鍵,而是普通的字段;

explain select u.* from tenant t left join `user` u on u.account = t.tenant_name where t.removed is null and u.removed is null;
登錄后復制

MySql常用查詢優化策略詳解

通過explain分析可以發現,左邊的表走了全表掃描,可以考慮給左邊的表的tenant_name和user表的account 各自創建索引;

create index idx_name on tenant(tenant_name);

create index idx_account on `user`(account);

再次使用explain分析結果如下

MySql常用查詢優化策略詳解

可以看到第二行type變為ref,rows的數量優化比較明顯。這是由左連接特性決定的,LEFT JOIN條件用于確定如何從右表搜索行,左邊一定都有,所以右邊是我們的關鍵點,一定需要建立索引 。

2.3 內連接關聯的字段建立索引

我們知道,左連接和右連接查詢的數據分別是完全包含左表數據,完全包含右表數據,而內連接(inner join 或join) 則是取交集(共有的部分),在這種情況下,驅動表的選擇是由mysql優化器自動選擇的;

在上面的基礎上,首先移除兩張表的索引

ALTER TABLE `user` DROP INDEX idx_account;
ALTER TABLE `tenant` DROP INDEX idx_name;

使用explain語句進行分析

MySql常用查詢優化策略詳解

然后給user表的account字段添加索引,再次執行explain我們發現,user表竟然被當作是被驅動表了;

MySql常用查詢優化策略詳解

此時,如果我們給tenant表的tenant_name加索引,并移除user表的account索引,得出的結果竟然都沒有走索引,再次說明,使用內連接的情況下,查詢優化器將會根據自己的判斷進行選擇;

MySql常用查詢優化策略詳解

3、子查詢優化

子查詢在日常編寫業務的SQL時也是使用非常頻繁的做法,不是說子查詢不能用,而是當數據量超出一定的范圍之后,子查詢的性能下降是很明顯的,關于這一點,本人在日常工作中深有體會;

比如下面這條sql,由于student表數據量較大,執行起來耗時非常長,可以看到耗費了將近3秒;

select st.* from student st where st.classId in ( 	 	select id from class where id > 100  );
登錄后復制

MySql常用查詢優化策略詳解

通過執行explain進行分析得知,內層查詢 id > 100的子查詢盡管用上了主鍵索引,但是由于結果集太大,帶入到外層查詢,即作為in的條件時,查詢優化器還是走了全表掃描;

MySql常用查詢優化策略詳解

針對上面的情況,可以考慮下面的優化方式

select st.id from student st join class cl on st.classId = cl.id where cl.id > 100;

子查詢性能低效的原因

  • 子查詢時,MySQL需要為內層查詢語句的查詢結果建立一個臨時表 ,然后外層查詢語句從臨時表中查詢記錄,查詢完畢后,再撤銷這些臨時表 。這樣會消耗過多的CPU和IO資源,產生大量的慢查詢;
  • 子查詢結果集存儲的臨時表,不論是內存臨時表還是磁盤臨時表都不能走索引 ,所以查詢性能會受到一定的影響;
  • 對于返回結果集比較大的子查詢,其對查詢性能的影響也就越大;

使用mysql查詢時,可以使用連接(JOIN)查詢來替代子查詢。連接查詢不需要建立臨時表 ,其速度比子查詢要快 ,如果查詢中使用索引的話,性能就會更好,盡量不要使用NOT IN 或者 NOT EXISTS,用LEFT JOIN xxx ON xx WHERE xx IS NULL替代;

一個真實的案例

在下面的這段sql中,優化前使用的是子查詢,在一次生產問題的性能分析中,發現某個tenant_id下的數據達到了35萬多,這樣直接導致某個列表頁面的接口查詢耗時達到了5秒左右;

MySql常用查詢優化策略詳解

找到了問題的根源后,嘗試使用上面的優化思路進行解決即可,優化后的sql大概如下,

MySql常用查詢優化策略詳解

4、排序(order by)優化

在mysql,排序主要有兩種方式

  • Using filesort : 通過表索引或全表掃描,讀取滿足條件的數據行,然后在排序緩沖區sort
    buffer中完成排序操作,所有不是通過索引直接返回排序結果的排序都叫 FileSort 排序;
  • Using index : 通過有序的索引順序掃描直接返回有序數據,這種情況即為 using index,不需要額外排序,操作效率高;

對于以上兩種排序方式,Using index的性能高,而Using filesort的性能低,我們在優化排序操作時,盡量要優化為 Using index

4.1 使用age字段進行排序

由于age字段未加索引,查詢結果按照age排序的時候發現使用了filesort,排序性能較低;

MySql常用查詢優化策略詳解

給age字段添加索引,再次使用order by時就走了索引;

MySql常用查詢優化策略詳解

4.2 使用多字段進行排序

通常在實際業務中,參與排序的字段往往不只一個,這時候,就可以對參與排序的多個字段創建聯合索引;

如下根據stuno和age排序

MySql常用查詢優化策略詳解

給stuno和age添加聯合索引

create index idx_stuno_age on `student`(stuno,age);

再次分析時結果如下,此時排序走了索引

MySql常用查詢優化策略詳解

關于多字段排序時的注意事項

1)排序時,需要滿足最左前綴法則,否則也會出現 filesort;

在上面我們創建的聯合索引順序是stuno和age,即stuno在前面,而age在后,如果查詢的時候調換排序順序會怎樣呢?通過分析結果發現,走了filesort;

MySql常用查詢優化策略詳解

2)排序時,排序的類型保持一致

在保持字段排序順序不變時,默認情況下,如果都按照升序或者降序時,order by可以使用index,如果一個是升序,另一個是降序會如何呢?分析發現,這種情況下也會走filesort;

MySql常用查詢優化策略詳解

5、分組(group by)優化

group by 的優化策略和order by 的優化策略非常像,主要列舉如下幾個要點:

  • group by 即使沒有過濾條件用到索引,也可以直接使用索引;
  • group by 先排序再分組,遵照索引建的最佳左前綴法則;
  • 當無法使用索引列時,增大 max_length_for_sort_data 和 sort_buffer_size 參數的設置;
  • where效率高于having,能寫在where限定的條件就不要寫在having中了;
  • 減少使用order by,能不排序就不排序,或將排序放到程序去做。Order by、groupby、distinct這些語句較為耗費CPU,數據庫的CPU資源是極其寶貴的;
  • 如果sql包含了order by、group by、distinct這些查詢的語句,where條件過濾出來的結果集請保持在1000行以內,否則SQL會很慢;

5.1 給group by的字段添加索引

如果字段未加索引,分析結果如下,這種結果性能顯然很低效

MySql常用查詢優化策略詳解

給stuno添加索引之后

MySql常用查詢優化策略詳解

給stuno和age添加聯合索引

MySql常用查詢優化策略詳解

如果不遵循最佳左前綴,group by 性能將會比較低效

MySql常用查詢優化策略詳解

遵循最佳左前綴的情況如下

MySql常用查詢優化策略詳解

6、count 優化

count() 是一個聚合函數,對于返回的結果集,一行行判斷,如果 count 函數的參數不是NULL,累計值就加 1,否則不加,最后返回累計值;

用法:count(*)、count(主鍵)、count(字段)、count(數字)

如下列舉了count的幾種寫法的詳細說明

用法 說明
count(主鍵) InnoDB 會遍歷整張表,把每一行的主鍵id值都取出來,返回給服務層,服務層拿到主鍵后,直接按行進行累加(主鍵不可能為null);
count(*) InnoDB不會把全部字段取出來,而是專門做了優化,不取值,服務層直接按行進行累加;
count(字段) 沒有not null 約束 : InnoDB 引擎會遍歷整張表把每一行的字段值都取出來,返回給服務層,服務層判斷是否為null,不為null,計數累加,有not null 約束:InnoDB 引擎會遍歷整張表把每一行的字段值都取出來,返回給服務層,直接按行進行累加;
count(數字) InnoDB 引擎遍歷整張表,但不取值。服務層對于返回的每一行,放一個數字“1”進去,直接按行進行累加;

經驗值總結

按照效率排序來看,count(字段) < count(主鍵 id) < count(1) ≈ count(*),所以盡量使用 count(*)

推薦學習:mysql視頻教程

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
激情伊人五月天| 免费的av在线| 欧美视频在线第一页| 男女视频在线看| 污污视频网站免费观看| 成人久久久久久久久| 国自产拍偷拍精品啪啪一区二区| 久久福利一区二区| 欧美aaa在线观看| 超碰在线资源站| 欧美国产在线一区| 深爱五月综合网| 天天操天天干天天做| 99国产精品久久久久久| 三区视频在线观看| 欧美污在线观看 | 男人c女人视频| 野外做受又硬又粗又大视频√| 天天做天天爱天天高潮| 免费观看亚洲视频| 大肉大捧一进一出好爽视频| 蜜臀久久99精品久久久酒店新书| 日本熟妇人妻中出| 欧美一级小视频| 精品国产一区二区三区在线| 一二三四中文字幕| 妞干网在线视频观看| 97公开免费视频| 国产成年人视频网站| av久久久久久| 国产一区二区三区精彩视频| 99中文字幕在线| 国产精品久久久久9999爆乳| 久久无码高潮喷水| 欧美xxxxxbbbbb| 国产91在线免费| 欧美在线aaa| 可以在线看的av网站| www.天天射.com| www成人免费| 精品久久久99| 黄色免费视频大全| 国产日本欧美在线| 午夜免费精品视频| 日本xxxxx18| 中文久久久久久| 自拍日韩亚洲一区在线| 黄色一级片免费播放| 精品中文字幕av| 国产一级大片免费看| 亚洲不卡视频在线| 精品这里只有精品| 亚洲国产一二三精品无码| 天堂av在线网站| 人妻有码中文字幕| 国产曰肥老太婆无遮挡| 欧美爱爱视频网站| 男人天堂成人在线| 男女激情免费视频| 中文字幕第一页亚洲| 色哟哟精品视频| 波多野结衣作品集| 国产综合av在线| 欧美在线一区视频| 欧日韩免费视频| 天天想你在线观看完整版电影免费| 99re精彩视频| 五月婷婷丁香色| 黄色三级视频片| 一区二区三区入口| 日本成人中文字幕在线| 国产一区视频免费观看| 免费av网址在线| 欧美日韩在线不卡视频| 欧美亚洲一二三区| 国产91对白刺激露脸在线观看| 高清在线观看免费| 男人操女人免费软件| 黄色国产精品视频| 色片在线免费观看| 亚洲免费av一区| 国产精品久久久久久久av福利| 99精品999| 久操手机在线视频| av免费观看大全| 精品中文字幕av| av网站在线不卡| 亚洲精品乱码久久久久久动漫| 亚洲综合123| 成人免费网站入口| av动漫在线观看| 青青草原国产在线视频| 日韩a一级欧美一级| 国产精品一线二线三线| 日韩精品视频一区二区在线观看| 欧美 日韩 国产 激情| 色啦啦av综合| 日本阿v视频在线观看| 少妇人妻互换不带套| 色姑娘综合天天| www插插插无码视频网站| 国产一区亚洲二区三区| 国产免费中文字幕| 精品人妻少妇一区二区| www.成人黄色| 国产美女网站在线观看| 欧美大片久久久| 日韩欧美不卡在线| 色呦色呦色精品| 欧美亚洲日本一区二区三区| 欧美日韩久久婷婷| 欧美 激情 在线| 日本男女交配视频| 中文字幕 欧美日韩| 美女av免费在线观看| 亚洲一区二区三区四区精品| 亚洲精品乱码久久久久久自慰| 小说区视频区图片区| 日本www.色| 亚洲不卡中文字幕无码| 亚洲色图都市激情| 一道本在线免费视频| 不卡影院一区二区| 精品人妻少妇一区二区| 日本中文字幕一级片| www.久久com| 亚洲天堂网站在线| a在线观看免费视频| 韩国一区二区av| 国产一级爱c视频| 国产自产在线视频| 国产 欧美 日本| 公共露出暴露狂另类av| 男人的天堂最新网址| 国产视频手机在线播放| 国产一线二线三线在线观看| 成人三级视频在线播放 | 中文字幕第22页| www.久久av.com| 国产精品嫩草影院8vv8| 伊人成人222| 手机免费看av网站| 日本美女久久久| 黑人巨茎大战欧美白妇| 欧美狂野激情性xxxx在线观| 日韩精品在线视频免费观看| 国产精品国三级国产av| 拔插拔插海外华人免费| 精品这里只有精品| 99视频免费播放| 亚洲AV无码成人精品一区| 成人污网站在线观看| 免费无码不卡视频在线观看| av无码精品一区二区三区| 北条麻妃av高潮尖叫在线观看| 色悠悠久久综合网| 黄色a级在线观看| 日日摸日日碰夜夜爽无码| 哪个网站能看毛片| 亚洲美女爱爱视频| 男人日女人的bb| 可以免费观看av毛片| 日本三级黄色网址| 日韩一级片一区二区| 免费看日本毛片| 国产色视频在线播放| 国产一区二区三区在线免费| 日韩欧美在线播放视频| 天堂在线中文在线| 色综合久久久久无码专区| 伊人影院综合在线| 人妻久久久一区二区三区| 日日干夜夜操s8| 91丨porny丨探花| 黄色a级三级三级三级| 干日本少妇首页| 久久天天东北熟女毛茸茸| 一区二区在线播放视频| 成年人深夜视频| 在线一区二区不卡| 成熟丰满熟妇高潮xxxxx视频| 国产不卡的av| 天天视频天天爽| 成人一对一视频| 久久香蕉视频网站| 国产传媒免费观看| 无码无遮挡又大又爽又黄的视频| 麻豆md0077饥渴少妇| 爱爱爱爱免费视频| 北条麻妃av高潮尖叫在线观看| 97干在线视频| www.九色.com| 少妇高潮流白浆| 一级黄色片国产| 福利视频999| 久久人人爽av| 国产三级国产精品国产专区50| 精品国产免费av| 无码专区aaaaaa免费视频| av动漫在线播放|