将MySQL子查询的结果保存到TEMPORARY TABLE中的开销(而不是复制子查询)?

时间:2013-06-10 08:42:04

标签: mysql performance

我正在编写一个报告库,它提供了一个用于以高级术语描述报告逻辑的DSL,然后将生成的AST编译成针对MySQL数据库运行的SQL。

有时输出包含重复的子查询。我正在考虑让编译器将这些重复的子查询拉到前面的CREATE TEMPORARY TABLE AS SELECT ...语句中,然后引用生成的临时表,而不是多次运行相同的子查询。

有没有经验丰富的MySQL性能评论这是否可能是一个有效的策略?一旦在内存中检索到SELECT的结果,是否有将这些结果保存在临时表中的重大开销?

或者MySQL的查询缓存是否会阻止相同的子查询运行多次?

POSTSCRIPT:我认为一般来说,我们的报告将使用的数据量不足以将临时表推送到磁盘。那么,假设它们可以保存在内存中,创建临时表会有很大的开销吗?

1 个答案:

答案 0 :(得分:1)

我认为这很大程度上取决于mysql的版本,因此您可能需要考虑限制您的报告库将使用哪个版本的mysql(如果您还没有)。

我的一般理解是MySQL子查询是BAD,并且转换为实际连接或使用临时表几乎总是更好 - 除非临时表被推送到磁盘!

我会阅读mysql提供的文档作为最新信息的一个很好的起点:dev.mysql.com/doc/internals/en/transformations.html和dev.mysql.com/doc/refman/5.5/en/优化-subqueries.html