MySQL 使用内存临时表的时机:
如果语句执行中可以一边读取数据,一边直接得到结果,是不需要额外内存。
join buffer 是无序数组,sort buffer 是有序数组,临时表是二维表结构。
如果需要考虑二维表结构,优先考虑临时表。比如 Union (Union All 不用,直接返回),group by 无索引+累计计数等情况。
也可以使用 SQL_BIG_RESULT 告知 MySQL 数据量很大,从而直接生成磁盘临时表。

另外,order by null 和不加 order by 不等价,前者是不排序。

MySQL order by逻辑MySQL join逻辑 文章中,我分别和你介绍了 sort buffer、内存临时表和 join buffer。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助 SQL 语句的执行的。其中,我们在排序的时候用到了 sort buffer,在使用 join 语句的时候用到了 join buffer。

然后,你可能会有这样的疑问,MySQL 什么时候会使用内部临时表呢?

MySQL union逻辑

MySQL groupby逻辑