mysql中的in語(yǔ)句是把外表和內(nèi)表作hash 連接,而exists語(yǔ)句是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢(xún)。
一直大家都認(rèn)為exists比in語(yǔ)句的效率要高,這種說(shuō)法其實(shí)是不準(zhǔn)確的。
這個(gè)是要區(qū)分環(huán)境的。
1. 如果查詢(xún)的兩個(gè)表大小相當(dāng),那么用in和exists差別不大。
2. 如果兩個(gè)表中一個(gè)較小,一個(gè)是大表,則子查詢(xún)表大的用exists,子查詢(xún)表小的用in。
3. not in和not exists:如果查詢(xún)語(yǔ)句使用了not in,那么內(nèi)外表都進(jìn)行全表掃描,沒(méi)有用到索引;
而not extsts 的子查詢(xún)依然能用到表上的索引。所以無(wú)論那個(gè)表大,用not exists都比not in要快。