MySQL什么时候会用内部临时表

  1. 如果语句执行过程可以一边读数据,一边直接得到结果,是不需要额外内存的。否则就需要额外内存,来保存中间结果。
  2. join_buffer是无序数组,sort_buffer是有序数组,临时表是二维表结构。
  3. 如果执行逻辑需要用到二维表特征,就会优先考虑使用临时表。

临时表优先生成于内存中,大小由参数tmp_table_size控制,默认16M,超过大小限制的,会从内存临时表,转为磁盘临时表。
MySQL支持通过只用SQL_BIG_RESULT这个hint来直接指定使用磁盘临时表。

group by优化

  1. 对于group by语句如果没有排序要求,要在语句后面加order by null;
  2. 尽量让group by过程用上表的索引,确认方法是explain结果中没有Using temporary和Using filesort。MySQL5.7后支持generated colomn机制,可以实现数据的关联更新,可以通过单独维护一个排序结果列并建立索引,来解决group by索引问题。
  3. 如果group by需要统计的数据量不大,尽量只使用内存临时表,可以适当增大tmp_table_size参数来。如果数据量实在太大,可以使用SQL_BIG_RESULT这个hint来直接使用磁盘临时表。