保留相关子查询的结果

时间:2020-06-10 04:42:10

标签: mysql

想象一下我有这样的查询:

Select 
  (SELECT a FROM table_10 LIMIT 1) AS sb1,
  (SELECT a FROM table_11 WHERE a=sb1 LIMIT 1) AS sb2,
  (SELECT a FROM table_12 WHERE a=sb2 LIMIT 1) AS sb3
FROM my_table WHERE 1

据我发现sb1,sb2和sb3的值未保存在内存中,并且当第二个子查询引用sb1时,它将再次重新运行第一个子查询。当第三个子查询引用sb2时,第二个子查询重新运行,因此第一个子查询将重新运行多次。 我这样做的原因是,当我对结果进行硬编码而不是引用sb1和sb2的结果时,我发现查询时间有很大的不同。 (就像30秒!)

我的第一个问题:对吗? 我的第二个问题:如何强制mysql将值保留在sb1和sb2中,而不是每次都不运行查询? 我的第三个问题:如果我做错了,那么造成时间和性能差异的原因是什么?

1 个答案:

答案 0 :(得分:0)

如何强制mysql将值保留在sb1和sb2中,而不是每次都不运行查询?

将您的相关查询转换为JOIN。形式上(忽略歧义)将是

Select 
  table_10.a AS sb1,
  table_11.a AS sb2,
  table_12.a AS sb3
FROM my_table 
CROSS JOIN table_10
INNER JOIN table_11 ON a=sb1
INNER JOIN table_12 ON a=sb2
WHERE 1
LIMIT 1

PS。没有ORDER BY的LIMIT没有意义。都用原始代码并提供了一个。

PPS。为每个列名称指定表别名。