在下面的查询:在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)
对子查询使用'IN'是一个糟糕的主意。由于查询本质上是一个等连接,所以你最好在连接中获得你想要的结果。 'SELECT column_a,column_b FROM table_a JOIN table_b ON column_b = b_id' – 2014-01-21 14:56:16
@TimSeguine:为什么这是一个糟糕的主意?如果'table_b'是一个N:M关系表,那么如果使用'JOIN',则会从'table_a'获得多行。这可能是不需要的。 – naitsirch 2016-05-30 13:46:13
@naitsirch这是一个坏主意,因为MySQL对从属子查询的支持不好。如果你能以任何方式避免它们,你可能应该。精心挑选的“GROUP BY”大部分时间消除了无关的结果。 – 2016-05-30 15:13:55