我正在编写一个报告库,它提供了一个用于以高级术语描述报告逻辑的DSL,然后将生成的AST编译成针对MySQL数据库运行的SQL。
有时输出包含重复的子查询。我正在考虑让编译器将这些重复的子查询拉到前面的CREATE TEMPORARY TABLE AS SELECT ...
语句中,然后引用生成的临时表,而不是多次运行相同的子查询。
有没有经验丰富的MySQL性能评论这是否可能是一个有效的策略?一旦在内存中检索到SELECT
的结果,是否有将这些结果保存在临时表中的重大开销?
或者MySQL的查询缓存是否会阻止相同的子查询运行多次?
POSTSCRIPT:我认为一般来说,我们的报告将使用的数据量不足以将临时表推送到磁盘。那么,假设它们可以保存在内存中,创建临时表会有很大的开销吗?
答案 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