RDS for mysql存在临时表的概念。包含“磁盘临时表”和“内存临时表”两种,其中磁盘临时表由于需要通过磁盘物理文件来存放,会导致sql的执行效率降低,因此需要尽量去避免这种现象的发生。内存临时表可以在控制台上通过tmp_table_size来设置其大小,通过这个设置可以将临时结果存储在内存中以供调用。当session生成的临时内容超过了内存临时表的配额后就会将内存临时表的数据转存到磁盘临时表。
下面的这些使用场景一定会使用到临时表,需要特别注意:
1)使用UNION或者UNION ALL时,SELECT子句中包含大于512字节的列。
2)表包含TEXT或者BLOB列;
3)GROUP BY 或者 DISTINCT 子句中包含长度大于512字节的列;
可使用explain查看执行计划,Extra列看到Using temporary就意味着使用了临时表。
用户可以通过下面列出的方式优化:
1)将较大的TEXT或者BLOB列拆分成多个较小的列;
2)对大量的group by和order by语句做拆分;
3)优化业务逻辑。
4)对group by和order by的列进行优化,添加索引;