in 外表一定循环完,次数取决于子表的个数。决定因素子表的大小。======>大表带小表。
exist 外表一定循环完,子表多少无所谓,不稳定。决定因素是外表的大小。========>小表带大表
in实现:
SELECT * FROM item vtt WHERE list_id IN ( SELECT ID FROM list vtt WHERE IS_DEL = 0 AND COMMENTS IS NOT NULL)
in实现转为exists实现:
1、关键字替换;
2、子查询中增加 AND VTT.list_id = vt.ID 外表和内表的关联
SELECT * FROM item vtt WHERE EXISTS ( SELECT * FROM list vt WHERE IS_DEL = 0 AND COMMENTS IS NOT NULL AND VTT.list_id = vt.ID )
IN
操作的次数取决于子查询的输出大小,而EXISTS
操作的次数主要取决于外表的大小。在优化查询时,如果子查询可以很快地找到匹配项,那么EXISTS
通常比IN
更高效。