大多數情況下,程序員比較喜歡使用in來查詢符合某些條件的數據,最近在查詢某個角色有哪些用戶的方法中,使用了in語句:
SELECT COUNT(1) FROM baseuser WHERE BaseUser.DeletionStateCode = 0 AND BaseUser.Enabled = 1 AND BaseUser.IsVisible = 1 AND BaseUser.Id > 0 AND BaseUser.Id IN (SELECT UserId FROM spysxtUserRole WHERE RoleId = '6d989d918dfe428c95e4469f866b1299' AND Enabled = 1 AND DeletionStateCode = 0)
可以看到時間是0.249ms;
一位朋友看到后,建議改為Join,改后的語句:
select count(1) from baseuser A left join (SELECT UserId FROM spysxtUserRole WHERE RoleId = '6d989d918dfe428c95e4469f866b1299' AND Enabled = 1 AND DeletionStateCode = 0) B on A.Id = B.UserId where B.UserId is not NULL and A.DeletionStateCode = 0 AND A.Enabled = 1 AND A.IsVisible = 1 AND A.Id > 0
耗時0.125ms,是用in查詢的一半;
查詢出的結果都是一樣的。
可以看出,使用join要比用in寫的復雜一些,但是效率確實提高跟多。建議能使用join的盡量改一下。