最近刷到面试题:Mysql 中 exists 和 in 的区别。
查了很多资料感觉理论说的很对的样子,但是没法让我信服,为啥 not in 就没用到索引呢?于是造数据验证。
先说下答案。
下面将主查询的表称为外表;子查询的表称为内表。exists 与 in 的区别如下:
子查询使用 exists,会先进行主查询,将查询到的每行数据循环带入子查询校验是否存在,过滤出整体的返回数据;子查询使用 in,会先进行子查询获取结果集,然后主查询匹配子查询的结果集,返回数据
外表内表相对大小情况不一样时,查询效率不一样:两表大小相当,in 和 exists 差别不大;内表大,用 exists 效率较高;内表小,用 in 效率较高。
不管外表与内表的大小,not exists 的效率一般要高于 not in,跟子查询的索引访问类型有关。
建表、造数据,验证一下以上答案。
# 建表 student1drop table if exists student1;create table student1(sid int primary key auto_increment,sname varchar(40));# 建存储过程给表 student1,插入1000条数据drop procedure if exists addStudent1;create procedure addStuden