面试
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中有哪几种锁?
- 表级锁:开销小,加锁快,不会出现死锁;锁定粒度大,冲突概率高,并发度最低
- 行级锁:开销大,加锁慢,会死锁,力度小,冲突概率低,并发度最高
- 页面锁:性能两者之间。
当列设置为auto increment 时,表中到达最大值会发生什么?
会停止递增,任何插入都产生错误,因为密钥已被使用。
怎么看一个表的所有索引?
mysql
SHOW INDEX FROM tablename