廣告型網(wǎng)站建設(shè)成人本科
- 【版權(quán)所有,文章允許轉(zhuǎn)載,但須以鏈接方式注明源地址,否則追究法律責(zé)任】
- 【創(chuàng)作不易,點個贊就是對我最大的支持】
前言
僅作為學(xué)習(xí)筆記,供大家參考
總結(jié)的不錯的話,記得點贊收藏關(guān)注哦!
目錄
- 前言
- 原SQL使用的是NOT IN
- 新SQL使用的是NOT EXISTS
- 結(jié)果:效率提升十倍不止
原SQL使用的是NOT IN
select a.id, b.messageId, a.sourceTypeId, a.title, a.messageTime, a.depId, a.status, b.setMark, b.msgType, b.msgRemarksfrom t_sync_data a left join t_message_seting b on a.id = b.messageId where exists (select 1 from t_sync_data where depId=136 andstatus!=4 and status!=2 and status!=5)<if test="messageIds != null and messageIds.size() >0"> and a.id NOT IN<foreach item="messageId" collection="messageIds" open="(" separator="," close=")">#{messageId}</foreach></if>order by a.messageTime desc, a.id desc, a.status
原因分析:我用了兩條sql來解決,第一條sql去查了一組id來排除數(shù)據(jù),導(dǎo)致每次查詢都要去遍歷
建議:能用1條sql出來還是用一條會更快,盡量不要用IN 、NOT IN
1、用 EXISTS 或 NOT EXISTS 代替
2、用JOIN 代替
這里我只查子表主表都存在的數(shù)據(jù),故用了內(nèi)連接,也可以用右連接,需求是以副表為主
新SQL使用的是NOT EXISTS
這里要注意一下:not exists子查詢要加一個條件:messageId=a.id 和外邊的表關(guān)聯(lián)起來,否則是查不到數(shù)據(jù)的
select a.id, b.messageId, a.sourceTypeId, a.title, a.messageTime, a.depId, a.status, b.setMark, b.msgType, b.msgRemarksfrom t_sync_data a inner join t_message_seting b on a.id = b.messageId where a.depId=136 and a.status!=4 and a.status!=2 and a.status!=5and not EXISTS (select idfrom t_message_task WHERE messageId=a.id<if test="depId != null ">and depId = #{depId}</if>)order by a.messageTime desc, a.id desc, a.status
結(jié)果:效率提升十倍不止
創(chuàng)作不易,點個贊就是對我最大的支持~
wxgzh:程序員溫眉
CSDN:程序員溫眉
每天進(jìn)步一點點的程序員