Skip to content

面试

MySQL in 和exists的区别

一般网上说,IN适合于外表大而子查询表小的情况,EXISTS适合外表小而子查询表大的情况。

mysql
# 2759174行数据
SELECT COUNT(*) FROM tb_data t1;

# 7262行数据
SELECT COUNT(*) FROM tb_task t2;

# 执行时间为44.88s
SELECT SQL_NO_CACHE t1.id FROM tb_data t1 WHERE t1.task_id IN (SELECT t2.id FROM tb_task t2);

# 执行时间为28.93s
SELECT SQL_NO_CACHE t1.id FROM tb_data t1 WHERE EXISTS (SELECT * FROM tb_task t2 WHERE t1.task_id = t2.id);

上面的SQL语句却是反例。

EXISTS和IN的介绍

EXISTS

exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时,条件就为真,返回当前loop到的这行记录。

如果exists里的条件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,能返回结果为true,不能则为false。

如果表A有N条记录,exists做的就是把表A的N条记录逐条取出,然后判断N次exists条件。

IN

in 查询相当于多个 or条件的叠加。

mysql
select * from user where user_id in (1, 2, 3);
select * from user where user_id = 1 or user_id = 2 or user_id = 3;

上面的两条查询语句是等价的。

in查询的子条件必须只有一个字段。

mysql
select * from user where user_id in (select id, age from B);

上面这条是错误的。

MySQL中有哪几种锁?

  1. 表级锁:开销小,加锁快,不会出现死锁;锁定粒度大,冲突概率高,并发度最低
  2. 行级锁:开销大,加锁慢,会死锁,力度小,冲突概率低,并发度最高
  3. 页面锁:性能两者之间。

当列设置为auto increment 时,表中到达最大值会发生什么?

会停止递增,任何插入都产生错误,因为密钥已被使用。

怎么看一个表的所有索引?

mysql
SHOW INDEX FROM tablename

wow!