想象一下我有这样的查询:
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中,而不是每次都不运行查询? 我的第三个问题:如果我做错了,那么造成时间和性能差异的原因是什么?
答案 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。为每个列名称指定表别名。