如何重新排序主键
- 删除主键
- 添加主键设置自动增长
临时表
概述
mysql在对数据处理时(分组,排序,联合表)涉及的数据可能会很大或是很复杂的操作,此时就需要一个临时表存放这些数据,以便进行下一步的处理。一般情况下,用到临时表就意味着性能较低,但在真正处理大量数据时却可能会提升总体速度
临时表分类
按照创建方式划分主要有两类,外部临时表和内部临时表
外部临时表是通过语句create temporary table…创建的,只在本会话有效,会话断开后,外部临时表数据会自动清理
内部临时表主要有两类,一类是information_schema中临时表,另一类是会话执行查询时,如果执行计划中包含有“Using temporary”时,会产生临时表
存储引擎
memory引擎:所有数据都在内存中,在内存中数据结构是一个数组(堆表),所有数据操作都在内存中完成,对于小数据量场景,速度比较快(不涉及物理IO操作)。但内存毕竟是有限的资源,因此,如果数据量比较大,则不适合用内存表
innodb引擎:适合大量数据的处理,数据存储在磁盘中,涉及物理IO操作,所以速度没有memory引擎速度快
引擎使用:临时表既可以innodb引擎表,也可以是memory引擎表
外部临时表通过建表语句create table …engine=memory使用指定存储引擎
内部临时表也可以通过查询时添加SQL_SMALL_RESULT(指定memory引擎)或SQL_BIG_RESULT(指定myisam引擎或innodb引擎)的方式使用指定存储引擎
如果没有指定是否使用内部临时表mysql会根据对数据进行的操作判断是否创建临时表,至于使用何种引擎要看数据量的大小,数据量小使用memory引擎,数据量大使用innodb引擎
使用场景
union
union操作的含义是,取两个子查询结果的并集,重复的数据只保留一行,通过建立一个带主键的临时表,就可以解决“去重”问题,通过临时表存储最终的结果集,所以能看到执行计划中Extra这一项里面有“Using temporary”。与union相关的一个操作是union all,后者也是将两个子查询结果合并,但不解决重复问题。所以对于union all,没有“去重”的含义,因此也就不需要临时表了
group by
group by的含义是按指定列分组,并默认按照指定列排序。在指定列没有索引的情况下会使用临时表处理数据,会看到Extra列中有Using filesort
消除临时表,在指定列有索引的情况下不会建立临时表
如果要消除排序可以使用 order by null,这样就不会默认排序了,会看到Extra中Using filesort消失
distinct
