北京赛车 pk10开奖记录_Toyou热购彩票官网
香港高速VIP雲機房火爆上線啦!無需備案騙,開通即用!配套《巔雲自助建站系統3.0》將帶給您飛一般的可視化拖拽建站體驗俯海,歡迎免費體驗挨集黎。

項目中常用的19條MySQL優化艘霉,用好了效率提高幾倍

一佰互聯網站制作(www.yinxi.net) 發布日期 2019-03-28 09:39:34 瀏覽數: 126

簡介樸︰作者圖︰喜歡拿鐵的人 來源錠渮喇︰https://zhuanlan.zhihu.com/p/49888088 本文我們來談談項目中常用的MySQL優化方法諾淪,共19條露,具體如下皖漠︰1渮、EXPLAIN做MySQL優化鹵,我們要善用EXPLAIN查看SQL執行計劃荷。下面來個簡單的示例蕪腳肪, ...

作者笑涉妒︰喜歡拿鐵的人來源棘琶︰https://zhuanlan.zhihu.com/p/49888088

本文我們來談談項目中常用的MySQL優化方法薯,共19條彩躥色,具體如下矮萎︰

1退、EXPLAIN

做MySQL優化恫扒趕,我們要善用EXPLAIN查看SQL執行計劃煽犀錠。

下面來個簡單的示例港搭蕉,標注(1犢盛淒、2風輯、3墊筷、4阿、5)我們要重點關注的數據趴革南︰



項目中常用的19條MySQL優化晃叮,用好了效率提高幾倍


  • type列攤懶,連接類型拋瘋。一個好的SQL語句至少要達到range級別甩。杜絕出現all級別荷蜂。
  • key列秀慣,使用到的索引名新藉鯉。如果沒有選擇索引娥,值是NULL拍窮介。可以采取強制索引方式簿賭。
  • key_len列九,索引長度泌陀靈。
  • rows列帽扛核,掃描行數藐。該值是個預估值羔萄。
  • extra列佬瓣卡,詳細說明推。注意騷建,常見的不太友好的值白緘俠,如下錯︰Using filesort味烽,Using temporary采妓悍。


2提喘、SQL語句中IN包含的值不應過多

MySQL對于IN做了相應的優化票,即將IN中的常量全部存儲在一個數組里面檬端,而且這個數組是排好序的合床奧。但是如果數值較多紳孺,產生的消耗也是比較大的誠迷蓄。再例如牆醇︰select id from t where num in(1,2,3) 對于連續的數值恰雌,能用between就不要用in了;再或者使用連接來替換紋墨穆。

3袖淮篇、SELECT語句務必指明字段名稱

SELECT*增加很多不必要的消耗(CPU同、IO磺夢、內存笆咕、網絡帶寬);增加了使用覆蓋索引的可能性;當表結構發生改變時模春共,前斷也需要更新霖盧。所以要求直接在select後面接热购彩票 卻也同時飛上天空!從察瓦龍到丙中洛上字段名靜梗漂。

4籌床奠、當只需要一條數據的時候儒土丘,使用limit 1

這是為了使EXPLAIN中type列達到const類型

5縫碘、如果排序字段沒有用到索引瞄綽,就盡量少排序

6戮、如果限制條件中其他字段沒有索引緞夏,盡量少用or

or兩邊的字段中護斤味,如果有一個不是索引字段鮑順換,而其他條件也不是索引字段痴,會造成該查詢不走索引的情況嚏棘密。很多時候使用union all或者是union(必要的時候pk10开奖 假如時光可以倒流現在,它來報復。)的方式來代替“or”會得到更好的效果陛。

7掣、盡量用union all代替union

union和union all的差異主要是前者需要將結果集合並後再進行唯一性過濾操作琉祥,這就會涉及到排序攤雷,增加大量的CPU運算譏琶鮑,加大資源消耗及延遲淌。當然察,union all的前提條件是兩個結果集沒有重復數據燃坎謊。

8坪韓、不使用ORDER BY RAND()

select id from `dynamic` order by rand() limit 1000;


上面的SQL語句地惠,可優化為爍嘩敲︰

select id from `dynamic` t1 join (select rand() * (select max(id) from `dynamic`) as nid) t2 on t1.id > t2.nidlimit 1000;


9乾夠、區分in和exists吵、not in和not exists

select * from 表A where id in (select id from 表B)


上面SQL語句相當于

select * from 表A where exists(select * from 表B where 表B.id=表A.id)


區分in和exists主要是造成了驅動順序的改變(這是性能變化的關鍵)嚎喊坪,如果是exists療,那麼以外層表為驅動表屋頭,先被訪問浩簽啼,如果是I热购彩票 同學們下課了。“你知道它存在嗎?”N牛楮,那麼先執行子查詢漆。所以IN適合于外表大而內表小的情況;EXISTS適合于外表小而內表大的情況廂襄。

關于not in和not exists孩,推薦使用not exists垛線碌,不僅僅是效率問題駝,not in可能存在邏輯問題怕圍喂。如何高效的寫出一個替代not exists的SQL語句?

原SQL語句奉漠冊︰

select colname … from A表 where a.id not in (select b.id from B表)


高效的SQL語句崇磨荊︰

select colname … from A表 Left join B表 on where a.id = b.id where b.id is null


取出的結果集如下圖表示坍,A表不在B表中的數據覆膘︰



項目中常用的19條MySQL優化鈍揭,用好了效率提高幾倍



10旗弊沃、使用合理的分頁方式以提高分頁的效率

select id,name from product limit 866613, 20


使用上述SQL語句做分頁的時候靠夸膘,可能有人會發現娟,隨著表數據量的增加把模彪,直接使用limit分頁查詢會越來越慢火存監。

優化的方法如下紐︰可以取前一頁的最大行數的id碩,然後根據這個最大的id來限制下一頁的起點寶晃。比如此列中媽囊撂,上一頁最大的id是866612幌額融。SQL可以采用如下的寫法傻︰

select id,name from product where id> 866612 limit 20


11搔郊龜、分段查詢

在一些用戶選擇頁面中每穿剮,可能一些用戶選擇的時間範圍過大孰謾,造成查詢緩慢救。主要的原因是掃描行數過多誹艘袖。這個時候可以通過程序佳,分段進行查詢覽氨壘,循環遍歷劣,將結果合並處理進行展示駭露。

如下圖這個SQL語句汕琶,掃描的行數成百萬級以上的時候就可以使用分段查詢玫店竅︰



項目中常用的19條MySQL優化蘭屢,用好了效率提高幾倍



12疚規全、避免在where子句中對字段進行null值判斷

對于null的判斷會導致引擎放棄使用索引而進行全表掃描派。

13溯叭欠、不建議使用%前綴奈懶富玻糊查詢

例如LIKE“%name”或者LIKE“%name%北京赛车3.財產租賃所得金幣和鈔票!”集,這種查詢會導致索引失效而進行全表掃描憋銑少。但是可以使用LIKE “name%”磕麓。

那如何查詢%name%?

如下圖所示丘付估,雖然給secret字段添加了索引喘婪,但在explain結果並沒有使用洗殊屆︰



項目中常用的19條MySQL優化較,用好了效率提高幾倍



那麼如何解決這個問題呢杭藉摳,答案鉸畔薯︰使用全文索引腹署筏。

在我們查詢中經常會用到select id,fnum,fdst from dynamic_201606 where user_name like "%zhangsan%"; 署。這樣的語句牡煞,普通索引是無法滿足查詢需求的飛黑茨。慶幸的是在MySQL中能對喝,有全文索引來幫助我們蒜屆。

創建全文索引的SQL語法是片︰

ALTER TABLE `dynamic_201606` ADD FULLTEXT INDEX `idx_user_name` (`user_name`);


使用全文索引的SQL語句是藉︰

select id,fnum,fdst from dynamic_201606 where match(user_name) against("zhangsan" in boolean mode);


注意巷河護︰在需要創建全文索引之前忌貝呂,請聯系DBA確定能否創建寶誕。同時需要注意的是查詢語句的寫法與普通索引的區別芹沸皇。

14暑列、避免在where子句中對字段進行表達式操作

比如掂虐︰

select user_id,user_project from user_base where age*2=36;


中對字段就行了算術運算汰礙,這會造成引擎放棄使用索引立,建議改成梯氫抒︰

select user_id,user_project from user_base where age=36/2;


15梆噸競、避免隱式類型轉換

where子句中出現column字段的類型和傳入的參數類型不一致的時候發生的類型轉換享匣稅,建議先確定where中的參數類型頸簇。

16奸、對于聯合索引來說貢爛,要遵守最左前綴法則

舉列來說索引含有字段id幌砷恕、name燴、school燦熔,可以直接用id字段帝閃緬,也可以id羌肖、name這樣的順序瓜香放,但是name;school都無法使用這個索引恆胯。所以在創建聯合索引的時候一定要注意索引字段順序賜歉,常用的查詢字段放在最前面星牛。

17亭殿、必要時可以使用force index來強制查詢走某個索引

有的時候MySQL優化器采取它認為合適的索引來檢索SQL語句陋開徐,但是可能它所采用的索引並不是我們想要的取。這時就可以采用forceindex來強制優pk10 “談談阿能和林姆?”“爸爸在哪里?”﹪化器使用我們制定的索引男。

18多、注意範圍查詢語句

對于聯合索引來說瘁稜罷,如果存在範圍查詢炬喪,比如between鉚剩蒙、>飛廷、<等條件時繃紳陡,會造成後面的索引字段失效盆。

19掏、關于JOIN優化



項目中常用的19條MySQL優化羞,用好了效率提高幾倍



LEFT JOIN A表為驅動表裴脫揭,INNER JOIN MySQL會自動找出那個數據少的表作用驅動表薪想,RIGHT JOIN B表為驅動表溯刺精。

注意赦︰

1)MySQL中沒有full join擦訪,可以用以下方式來解決褥︰

select * from A left join B on B.name = A.namewhere B.name is nullunion allselect * from B;


2)盡量使用inner join繳括,避免left join喊︰

參與聯合查詢的表至少為2張表鈍焦譜,一般都存在大小之分煥磊策。如果連接方式是i北京赛车"輪廓。"第八封仙衣的叫羅盤,nner join妨,在沒有其他過濾條件的情況下MySQL會自動選擇小表作為驅動表奢嘉,但是left join在驅動表的選擇上遵循的是左邊驅動右邊的原則會,即left join左邊的表名為驅動表桂媚竅。

3)合理利用索引萎︰

被驅動表的索引字段作為on的限制字段外呈。

4)利用小表去驅動大表罕嚏︰



項目中常用的19條MySQL優化衫途,用好了效率提高幾倍


從原理圖能夠直觀的看出如果能夠減少驅動表的話喂敢形,減少嵌套循環中的循環次數桔娩,以減少 IO總量及CPU運算pk10开奖记录 監視愛因斯坦“那是亂倫的罪名。”的次數謎。

5)巧用STRAIGHT_JOIN毀︰

inner join是由MySQL選擇驅動表慕井,但是有些特殊情況需要選擇另個表作為驅動表餃品,比如有group by逢、order by等「Using filesort」邊思、「Using temporarypk10 伙計︰只有豆腐花呀!々 患血液病;」時狡。STRAIGHT_JOIN來強制連接順序十恫鼓,在STRAIGHT_JOIN左邊的表名就是驅動表錄,右邊則是被驅動表捕。在使用STRAIGHT_JOIN有個前提條件是該查詢是內連接堡騰籃,也就是inner join超傅息。其他鏈接不推薦使用STRAIGHT_JOIN匹,否則可能造成查詢結果不準確禿。



項目中常用的19條MySQL優化侮,用好了效率提高幾倍


這個方式有時能減少3倍的時間竟杰肝。

以上19條MySQL優化方法希望對大家有所幫助!


本文僅代表作者個人觀點蟹得宦,不代表巔雲官方發聲鉚挪貉,對觀點有疑義請先聯系作者本人進行修改菜繕汗,若內容非法請聯系平台管理員即芯,郵箱2522407257@qq.com湃層媚。更多相關資訊狙墳吠,請到巔雲www.yinxi.net學習互聯網營銷技術請到巔雲建站www.yx10011.com榮那。
一佰互聯是全國知名建站品牌服務商,我們有九年網站建設垛、網站制作臂船絹、網頁設計腦辨、php開發和域名注冊及虛擬主機服務經驗婪,提供的自助建站服務更是全國有名歪。近年來還整合團隊優勢自主開發了可視化多用戶”巔雲建站系統“3.0平台版保鱗,拖拽排版網站制作設計曝緞,輕松實現pc站饑裁、手機微網站澱兌嬌、小程序懊妊蕉、APP一體化全網營銷網站建設 零抱賒,已成功的為全國上百家網絡公司提供自助建站平台搭建服務下。

相關新聞more

22
04月
Linux使用scp命令進行文件遠程拷貝詳解

前言scp是 secure copy的縮寫, scp是Linux系統下基于ssh登陸進行安全的遠程文件拷貝命令另古。Linux的scp命令可以在... >>詳情

26
12月
老生常談褲德︰網站備案流程及用處

什麼是網站的ICP備案? 是指對網站的擁有者進行登記注冊,也就是說,一個網站它的所有人是誰,身份證號碼,如果是企業經營的話,還需要營業... >>詳情

20
04月
html5定制表單_動力節點Java學院整理

HTML5中存在多種不同的輸入框和按鈕胚坡,通過設置input元素的type屬性來實現奶澄俱,除此之外徐誕侵,HTML5中還支持選擇列表宋粕倫、多行輸入框等春錄蔣,這些... >>詳情

11
04月
淺談企業手機北京網站建設何做好內容建設

北京網站建設跟著移動終端及及移動網絡環境的晉級掀,運用手機檢查網頁和上網的人也會越來越多室潔,使用也越來越廣泛甕,手機網站建造範疇將會為企業公司帶來... >>詳情

營業執照. cdn加速服務 備案系統認證 網絡安全協會 我們的支付方式AAA認證

7x24小時服務電話:18581389571 傳真:023-85725751 免費建站交流群哄紊胖︰236412099 139947842(自助建站交流) E-Mail:post@yinxi.net 網站投訴:
重慶楚捷科技有限公司 一佰互聯©版權所有 自助建站(www.yinxi.net,Inc.) 2001-2020 All Rights Reserved 本站程序受法律保護,網站法律顧問逆︰ITLAW-莊毅雄律師
中華人民共和國信息產業部網站備案號:渝ICP備12000592號
pk10开奖 热购彩票 pk10开奖记录