答案 0 :(得分:1)
如果您将使用EXPLAIN,那么当您使用子查询和使用JOINS时,您将看到它所产生的差异。在大多数情况下,JOINS相对较快。
的好文章在JOIN中,RDBMS可以创建一个更适合您的执行计划 查询并可以预测要加载哪些数据以进行处理 节省时间,不像子查询,它将运行所有查询和 加载所有数据以进行处理。
参见文章中的测试:
我添加了100,000个商家和150,000条消息(随机类型为 随机商家)。
方法1:加入我相信JOIN比子查询更快的时间,所以我首先尝试了这种方法。 (注意:我不得不这样做 设置SET SQL_BIG_SELECTS = 1;只是为了让查询运行...糟糕 签字!)。
SELECT SQL_NO_CACHE b.id, b.name FROM `businesses` b LEFT JOIN `business_messages` bm ON b.id = bm.business_id AND bm.type = 'action' WHERE bm.type IS NULL LIMIT 10;
方法2:子查询在WHERE这个方法是由我堂兄发给我的。阅读和理解查询的内容要容易得多 试图做:
SELECT SQL_NO_CACHE id, name FROM businesses b WHERE NOT EXISTS ( SELECT 1 FROM business_messages WHERE business_id = b.id AND type = 'action' ) LIMIT 10;
方法3:JOIN中的子查询这是我在看到子查询实际运行后的想法:
SELECT SQL_NO_CACHE id, name FROM businesses b LEFT JOIN ( SELECT business_id, type FROM business_messages WHERE type = 'action' GROUP BY business_id ) bm ON bm.business_id = b.id WHERE bm.type IS NULL LIMIT 10;
<强>结果
Method 1 Method 2 Method 3 1 5.51s 3.91s 0.41s 2 6.60s 4.74s 0.36 3 7.68s 2.40s 0.64s 4 4.23s 2.63s 0.36s 5 6.71s 2.06s 0.30s 6 5.23s 2.01s 0.53s 7 4.03s 2.80s 0.43s 8 4.56s 2.44s 0.55s 9 7.13s 1.95s 0.80s 10 7.04s 1.38s 0.43s Average 5.872s 2.632s 0.481s
答案 1 :(得分:0)
如果您打算使用执行计划,您将看到差异。在优化方面,最好使用JOIN
而不是使用子查询,因为子查询可能需要太多的执行时间,尤其是在处理大量数据时。