SQL exists子查询优化注意事项,关联字段缺失索引隐患

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);
posted @ 2026-10-15 08:49  暗流断念-备用参考  阅读(6)  评论(0)    收藏  举报