mysql查詢語句in和exists二者的區別和性能影響
如果查詢的兩個表大小相當,那么用in和exists差別不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in: 例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=*) 效率高,用到了B表上cc列的索引。 相反的2:select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=*) 效率低,用到了A表上cc列的索引。
not in 和not exists如果查詢語句使用了not in 那么內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
in 與 =的區別 select name from student where name in ('zhang','wang','li','zhao'); 與 select name from student where name='zhang' or name='li' or name='wang' or name='zhao' 的結果是相同的。
mysql查詢語句in和exists二者的區別和性能影響
如說兩張表一張是用戶表TDefUser(userid,address,phone),一張是消費表TAccConsume(userid,time,amount),我要查消費超過5000的用戶記錄,那么可以寫
select * from TDefUser where exists (select 1 from TAccConsume where *=* and *> 5000)也可以:
select * from TDefUser where userid in (select userid from TAccConsume where *> 5000)exists()后面的子查詢被稱做相關子查詢
其運行方式是先運行主查詢一次 再去子查詢里查詢與其對應的結果 如果是ture則輸出,反之則不輸出.再根據主查詢中的每一行去子查詢里去查詢.
in()后面的子查詢 是返回結果集的,換句話說執行次序和exists()不一樣.子查詢先產生結果集,然后主查詢再去結果集里去找符合要求的字段列表去.符合要求的輸出,反之則不輸出.
性能影響的話,這個是沒有固定那一個好,要針對自身條件來使用。
一直以來認為exists比in效率高的說法是不準確的。
如果查詢的兩個表大小相當,那么用in和exists差別不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)
1:
select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=*) 效率高,用到了B表上cc列的索引。相反的
2:
select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=*) 效率低,用到了A表上cc列的索引。not in 和not exists如果查詢語句使用了not in 那么內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
in 與 =的區別
select name from student where name in ('zhang','wang','li','zhao');
與
select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的結果是相同的。