exists性能优势前提:子查询的关联条件字段必须建立索引;没有索引exists和in一样会发生全表扫描;上线复杂exists查询务必使用explain确认子表访问类型,避免性能隐患。
场景:查询有下单记录的用户,子查询order表uid没有索引,exists查询耗时很高,增加索引后性能大幅提升。核心知识点:exists半连接原理、关联字段索引必要性、explain验证执行计划。
drop table if exists app_order;drop table if exists app_user;CREATE TABLE app_user( user_id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32));CREATE TABLE app_order( order_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, amount DECIMAL(10,2));
INSERT INTO app_user(name) VALUES ('u1'),('u2'),('u3'),('u4');INSERT INTO app_order(user_id,amount) VALUES (1,100),(1,200),(3,500);
-- 无索引版本,app_order.user_id无索引,会对子表全表扫描EXPLAIN SELECT * FROM app_user uWHERE EXISTS(SELECT 1 FROM app_order o WHERE o.user_id = u.user_id);
-- 给子查询关联字段建立索引CREATE INDEX idx_ord_uid ON app_order(user_id);
EXPLAIN SELECT * FROM app_user uWHERE EXISTS(SELECT 1 FROM app_order o WHERE o.user_id = u.user_id);