SQL優(yōu)化

等價(jià)替換left join / right join查詢

多表的left join / right join關(guān)聯(lián)查詢性能較低,可以考慮等價(jià)替換為join的SQL語(yǔ)句或者是用逗號(hào)分隔各個(gè)表芝加,然后用where條件替代on條件作為關(guān)聯(lián)條件的方式硅卢,關(guān)聯(lián)查詢多表(目前也推薦用逗號(hào)分隔射窒,where條件替代on條件的方式進(jìn)行多表內(nèi)連接查詢)。

例如對(duì)于同時(shí)符合以下設(shè)定的場(chǎng)景下:

  1. 如果A表為主表将塑,B為從表脉顿。
  2. 其中,出參包含AB兩個(gè)表的數(shù)據(jù)点寥,查詢的條件可能來(lái)源于A艾疟,B表。
  3. A表有記錄敢辩,B表未必有記錄蔽莱。
  4. B表的code字段與A表的主鍵id字段關(guān)聯(lián)。
  5. 各個(gè)查詢條件之間是AND關(guān)系戚长。

那么盗冷,查詢SQL語(yǔ)句最直觀地會(huì)寫為:

select A.id, B.id from A left join B on A.id=B.code where ……

但是這樣的SQL語(yǔ)句在寬表引擎下并非性能最佳, 可以等價(jià)替換為如下:

  1. 如果查詢條件來(lái)源于A和B兩表同廉,并且查詢條件都是AND邏輯拼接仪糖。可以改為:
select A.id, B.id from A, B where A.id=B.code and ……
  1. 如果查詢條件只來(lái)源于A表迫肖,可改為使用以下的兩條SQL:
select A.id from A where ……

將以上查詢獲取得到的A表的id傳入到下列B表的SQL锅劝,查詢獲取B表的出參。

select B.id from B where B.code=?
  1. 如果查詢條件只來(lái)源于B表蟆湖,可以改為使用以下的兩條SQL:
select B.id, B.code from B where ……

將以上查詢獲取得到的B表的code傳入到下列A表的SQL故爵,查詢獲取A表的出參。

select A.id from A where A.id=?

count查詢不應(yīng)該帶order by

count查詢的目的是為了返回符合條件的總記錄數(shù)隅津,但是order by則是對(duì)符合條件的記錄進(jìn)行排序稠集,查詢總數(shù)無(wú)需排序,排序則會(huì)增加非必要的耗時(shí)饥瓷,應(yīng)該在count查詢語(yǔ)句中刪除order by剥纷。


結(jié)合實(shí)際業(yè)務(wù)場(chǎng)景考慮是否在查詢SQL中帶有order by,count

如果模型中滿足某條件的數(shù)據(jù)量很大呢铆,查詢的SQL語(yǔ)句中帶有order by晦鞋,count過(guò)程非常緩慢」卓耍可結(jié)合自身業(yè)務(wù)場(chǎng)景考慮是否可以放棄悠垛。

如果業(yè)務(wù)上的 order bycount 不能刪除娜谊,可以通過(guò)以下的方案進(jìn)行優(yōu)化:

涉及count的優(yōu)化
由于count查詢嚴(yán)重影響查詢體驗(yàn)确买,所以可以考慮分情況討論是否需要查詢countcount一般用于前端分頁(yè)展示選擇頁(yè)數(shù)纱皆,來(lái)進(jìn)行分頁(yè)選擇查詢湾趾。count查詢的優(yōu)化方案芭商,將腳本查詢接口的count輸出改為可選輸出,然后通過(guò)入?yún)⒖刂剖欠褫敵霾蟛绻枰敵鲈俨樵?code>count铛楣,否則不返回count

a. 對(duì)于頁(yè)面上調(diào)用腳本的查詢接口時(shí)艺普,先試探查詢傳入start=5000簸州,limit=5001,首次查詢先通過(guò)入?yún)⒖刂撇徊樵?code>count并且攜帶其他查詢條件歧譬,如果返回記錄不為空岸浑,則表示滿足條件的記錄大于5000條。
b. 如果能查出一條記錄則表示記錄超過(guò)5000瑰步,則后續(xù)的正常分頁(yè)查詢也不查詢count矢洲,只將分頁(yè)查詢的返回分頁(yè)數(shù)據(jù)展示到頁(yè)面上,頁(yè)面也不展示count面氓。頁(yè)面也只可以翻頁(yè)到0~5000的記錄兵钮,5000以上的無(wú)法看蛆橡。
c. 如果查不到記錄(表示滿足條件的數(shù)量少于5000)舌界。則可以正常返回count,將返回的count用于前端分頁(yè)的總記錄數(shù)量泰演,此時(shí)返回的分頁(yè)數(shù)據(jù)亦可以正常展示呻拌,用法與普通的分頁(yè)查詢用法一致。


多表關(guān)聯(lián)不要使用select * 的方式返回對(duì)應(yīng)字段的記錄

由于多表關(guān)聯(lián)字段的數(shù)量較多睦焕,如果是select *藐握,可能會(huì)返回很多不需要的字段記錄,導(dǎo)致增加了非必要的數(shù)據(jù)傳輸垃喊。建議不要使用select *猾普,而是根據(jù)需要返回的字段一個(gè)個(gè)列出來(lái),例如只需要id就寫為select id本谜。


非必要場(chǎng)景下初家,避免使用distinct關(guān)鍵字進(jìn)行記錄去重

如果確定了返回的記錄不會(huì)有重復(fù)的,應(yīng)該避免使用distinct關(guān)鍵字進(jìn)行去重乌助,distinct關(guān)鍵字在并發(fā)情況下性能較差溜在。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市他托,隨后出現(xiàn)的幾起案子掖肋,更是在濱河造成了極大的恐慌,老刑警劉巖赏参,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件志笼,死亡現(xiàn)場(chǎng)離奇詭異沿盅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)籽腕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門嗡呼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人皇耗,你說(shuō)我怎么就攤上這事南窗。” “怎么了郎楼?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵万伤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我呜袁,道長(zhǎng)敌买,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任阶界,我火速辦了婚禮虹钮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膘融。我一直安慰自己芙粱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布氧映。 她就那樣靜靜地躺著春畔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岛都。 梳的紋絲不亂的頭發(fā)上律姨,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音臼疫,去河邊找鬼择份。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烫堤,可吹牛的內(nèi)容都是我干的荣赶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼塔逃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讯壶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起湾盗,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伏蚊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后格粪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躏吊,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氛改,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了比伏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胜卤。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赁项,靈堂內(nèi)的尸體忽然破棺而出葛躏,到底是詐尸還是另有隱情,我是刑警寧澤悠菜,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布舰攒,位于F島的核電站,受9級(jí)特大地震影響悔醋,放射性物質(zhì)發(fā)生泄漏摩窃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一芬骄、第九天 我趴在偏房一處隱蔽的房頂上張望猾愿。 院中可真熱鬧,春花似錦账阻、人聲如沸蒂秘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)材彪。三九已至观挎,卻和暖如春琴儿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘁捷。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工造成, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雄嚣。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓晒屎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缓升。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鼓鲁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348