優化原則:小表驅動大表,即小的數據集驅動大的數據集。
############# 原理 (RBO) #####################
select * from A where id in (select id from B)等價于:for select id from Bfor select * from A where A.id = B.id
當B表的數據集必須小于A表的數據集時,用in優于exists。
select * from A where exists (select 1 from B where B.id = A.id)等價于for select * from Afor select * from B where B.id = A.id
當A表的數據集系小于B表的數據集時,用exists優于in。
注意:A表與B表的ID字段應建立索引。
例如:
/** 執行時間:0.313s **/SELECT SQL_NO_CACHE * FROM rocky_member m WHERE EXISTS (SELECT 1 FROM rocky_vip_appro a WHERE m.ID = a.user_id AND a.passed = 1);/** 執行時間:0.160s **/SELECT SQL_NO_CACHE * FROM rocky_member m WHERE m.ID in(SELECT ID FROM rocky_vip_appro WHERE passed = 1);
not in 和not exists用法類似。
新聞熱點
疑難解答