。点击上方"蓝字"
关注我们,享更多干货!
IN和EXISTS被频繁使用在SQL中,虽然作用是一样的,但是在使用效率谁更高这点上众说纷纭。下面我们就通过一组测试来看,在不同场景下,使用哪个效率更高。
测试数据:
B表: 大表,大约300000行数据
CREATE TABLE `B` (
`id` int NOT NULL AUTO_INCREMENT,
`B_id` int NOT NULL,
`value` varchar(20) NOT NULL,
`flag` int not null,
PRIMARY KEY (`id`),
KEY `idx_b_flag` (`flag`),
KEY `idx_b_id` (`B_id`)
)
A表: 小表,20000行数据
CREATE TABLE `A` (
`id` int NOT NULL AUTO_INCREMENT,
`flag` int NOT NULL,
`value` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_a_flag` (`flag`)
)
测试1:
子查询 select flag from B where B_id<100 结果集99条。
select * from A where flag in (select flag from B where B_id<100 );
198 rows in set (0.00 sec)
select * from A where exists (select * from B where B_id<100 and A.flag=B.flag);
198 rows in set (0.10 sec)
可以看到本次测试IN效率高于EXISTS。
再看执行计划:
IN的执行计划:
(1)执行A表的查询,查询条件是A.flag在结果集B里面