優化原則:小表驅動大表,即小的資料集驅動大的資料集。
############# 原理 (RBO) #####################
select * from A where id in (select id from B)
等價于:
for select id from B
for 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 A
for 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);