MySQL 中 in 和 exists 的区别?
在 MySQL 中,IN关键字用于在一个字段中匹配多个值。它的语法如下:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
EXISTS关键字用于检查子查询的结果是否为空。它的语法如下:
SELECT column_name(s)
FROM table_name
WHERE EXISTS (subquery);
区别:
MySQL 中的 in 语句是把外表和内表作 hash 连接,而 exists 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询。
单纯的理解 exists 比 in 语句的效率要高的说法其实是不准确的,要区分情景:
- 如果查询的两个表大小相当,那么用 in 和 exists 差别不大。
- 如果两个表中一个较小,一个是大表,则子查询表大的用 exists,子查询表小的用 in。
- not in 和 not exists:
- 如果查询语句使用了 not in,那么内外表都进行全表扫描,没有用到索引;
- 而 not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用 not exists 都比 not in 要快。