2

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

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

任何对 MySQL 性能有经验的人都可以评论这是否可能是一种有效的策略吗?在内存中检索到a 的结果后SELECT,将这些结果保存在临时表中是否有任何重大开销?

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

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

4

1 回答 1

1

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

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

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

于 2013-06-10T08:56:28.763 回答