1

我正在优化一个mysql查询,该查询将 2 个表连接在一起,并有一些 where 子句和一个 order by。

我注意到(使用解释)在查询评估期间创建了一个临时表。(因为我正在对不是加入队列中第一个表的表中的字段进行分组)

我真的很想知道这个临时表是否正在写入磁盘,解释结果没有告诉我。

能够知道究竟是什么进入所述临时表也很好。我的 where 子句中的一些限制是在索引列上,而有些则不是,所以我认为 mysql 可能不会以最佳方式将行选择到临时表中。

具体来说,我的查询基本上是以下形式: select ... from a join b where ... 对索引列和非索引列的 a 和 b 都有限制。问题是进入从 a 中选择的临时表的行数比我怀疑的要多。我想对此进行调查。

4

1 回答 1

-2

所有数据库都使用内存区域或工作区域来执行查询,并将根据您构建查询的方式在这些内存区域中使用临时表。如果您加入多个表,它可能会使用多个表来构建最终结果集。只要用户登录,这些临时表通常就存在于内存中。

Explain 说明了它在解释 SQL 时尝试优化的过程。如果您的 where 子句索引不佳,或者您在连接中使用 where 子句,则可能会在执行和构建最终结果集时将过多的数据拉入内存。这就是数据库级别性能不佳的样子。

通过阅读最后一段中的伪代码,我会说您需要一些索引并重写您的 Where 子句以加入索引字段。如果您真的想发表意见,请发布您的 SQL。

于 2013-04-10T04:32:19.447 回答