2012-08-08 65 views
12

在下面的查询:在WHERE子句中使用时,是否通过MySQL缓存子查询?

SELECT column_a, column_b FROM table_a WHERE 
    column_b IN (SELECT b_id FROM table_b) 

由SQL解析器缓存的子查询SELECT b_id FROM table_b,或者它会更快事先做了查询,将其保存为一个变量(在PHP,例如),然后将这些值作为CSV字符串传递?

例如

SELECT column_a, column_b FROM table_a WHERE 
    column_b IN (1,3,4,6,8,10,16,18) 
+0

对子查询使用'IN'是一个糟糕的主意。由于查询本质上是一个等连接,所以你最好在连接中获得你想要的结果。 'SELECT column_a,column_b FROM table_a JOIN table_b ON column_b = b_id' – 2014-01-21 14:56:16

+0

@TimSeguine:为什么这是一个糟糕的主意?如果'table_b'是一个N:M关系表,那么如果使用'JOIN',则会从'table_a'获得多行。这可能是不需要的。 – naitsirch 2016-05-30 13:46:13

+1

@naitsirch这是一个坏主意,因为MySQL对从属子查询的支持不好。如果你能以任何方式避免它们,你可能应该。精心挑选的“GROUP BY”大部分时间消除了无关的结果。 – 2016-05-30 15:13:55

回答

6

查看使用EXPLAIN EXTENDED来充分说明对子查询造成的影响。

例如:

EXPLAIN EXTENDED 
SELECT column_a, column_b FROM table_a WHERE 
    column_b IN (SELECT b_id FROM table_b) 

如果他们不产生缓存结果你愿意,你可能有兴趣在它们存储在内存(memcacheredis),对文件(使用PHP file libraries),或在单独的SQL缓存本身。

+11

这是我今天看到的最不正确的答案。 – 2012-09-25 21:23:34

+1

@ypercubeᵀᴹ和任何人upvoted它,你可以请解释或提供替代的答案? – Secret 2016-11-11 11:54:38