mysql中在使用select语句进行查询的时候也可能会用到临时表,而如果用到临时表会导致性能大打折扣,甚至会给线上带来很大的问题,下面针对mysql临时简单介绍一下:
1.mysql临时表分为“内存临时表”和“磁盘临时表”,其中内存临时表使用MYSQL的MEMORY存储引擎,磁盘临时表使用MYSQL的MyISAM存储引擎;大多数情况下,MYSQL会优先创建内存临时表,但是内存临时表超过配置指定的值后,MYSQL会将内存临时表导出到磁盘临时表,导出到磁盘临时表的过程中,就会出现大量的IO读写,严重影响机器性能;
2.使用临时表的场景有以下几种情况:
(1)ORDER BY 字句和GROUP BY字句不同,例如:ORDER BY price GROUP BY name
(2)在JOIN查询中,ORDER BY 和GROUP BY使用的不是第一个表的列
(3)ORDER BY 中使用distinct关键字
3.直接使用磁盘临时表的场景:
(1)表中包含TEXT或者BLOB列
(2)GROUP BY或者DISTINCT字句中包含大于512字节的列
4.使用临时表会导致性能大大降低,尤其是使用磁盘临时表,因此应该避免使用临时表,需要做到以下几点:
(1)在GROUP BY或者ORDER BY的列上创建索引
(2)分拆列,一般情况下,TEXT BLOB或者大于512字节长度的列,基本上都是为了显示信息,而不会用于查询条件,在表设计的时候把这种列移到另外一张表中。
(3)如果表的设计已经确定,可以通过优化SQL提高SQL的执行效率:拆分SQL语句或者优化业务,去掉分组排序等操作
5.如何查看是否使用临时表,使用explain,Extra列看到Using temporary,就是使用了临时表