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 什么时候会使用内部临时表呢?