天天看點

MYSQL IN 與 EXISTS 的優化示例介紹

優化原則:小表驅動大表,即小的資料集驅動大的資料集。

############# 原理 (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);      

繼續閱讀