Evaluation of statements that contain an ORDER BY clause and a different GROUP BY clause, or for which the ORDER BY or GROUP BY contains columns from tables other than the first table in the join queue.
Evaluation of DISTINCT combined with ORDER BY may require a temporary table.
For queries that use the SQL_SMALL_RESULT modifier, MySQL uses an in-memory temporary table, unless the query also contains elements (described later) that require on-disk storage.
To determine whether a statement requires a temporary table, use EXPLAIN and check the Extra column to see whether it says Using temporary (see Section 8.8.1, “Optimizing Queries with EXPLAIN”). EXPLAIN will not necessarily say Using temporary for derived or materialized temporary tables.
Some query conditions prevent the use of an in-memory temporary table, in which case the server uses an on-disk table instead:
Presence of a BLOB or TEXT column in the table. This includes user-defined variables having a string value because they are treated as BLOB or TEXT columns, depending on whether their value is a binary or nonbinary string, respectively.
Presence of any string column with a maximum length larger than 512 (bytes for binary strings, characters for nonbinary strings) in the SELECT list, if UNION or UNION ALL is used.
The SHOW COLUMNS and DESCRIBE statements use BLOB as the type for some columns, thus the temporary table used for the results is an on-disk table.
The server does not use a temporary table for UNION statements that meet certain qualifications. Instead, it retains from temporary table creation only the data structures necessary to perform result column typecasting. The table is not fully instantiated and no rows are written to or read from it; rows are sent directly to the client. The result is reduced memory and disk requirements, and smaller delay before the first row is sent to the client because the server need not wait until the last query block is executed. EXPLAIN and optimizer trace output reflects this execution strategy: The UNION RESULT query block is not present because that block corresponds to the part that reads from the temporary table.
These conditions qualify a UNION for evaluation without a temporary table:
The union is UNION ALL, not UNION or UNION DISTINCT.
There is no global ORDER BY clause.
The union is not the top-level query block of an {INSERT | REPLACE} ... SELECT ... statement.
Internal Temporary Table Storage Engine
An internal temporary table can be held in memory and processed by the MEMORY storage engine, or stored on disk by the InnoDB or MyISAM storage engine.
If an internal temporary table is created as an in-memory table but becomes too large, MySQL automatically converts it to an on-disk table. The maximum size for in-memory temporary tables is defined by the tmp_table_size or max_heap_table_size value, whichever is smaller. This differs from MEMORY tables explicitly created with CREATE TABLE. For such tables, only the max_heap_table_size variable determines how large a table can grow, and there is no conversion to on-disk format.
The internal_tmp_disk_storage_engine variable defines the storage engine the server uses to manage on-disk internal temporary tables. Permitted values are INNODB (the default) and MYISAM.
When an internal temporary table is created in memory or on disk, the server increments the Created_tmp_tables value. When an internal temporary table is created on disk, the server increments the Created_tmp_disk_tables value. If too many internal temporary tables are created on disk, consider increasing the tmp_table_size and max_heap_table_size settings.
Internal Temporary Table Storage Format
In-memory temporary tables are managed by the MEMORY storage engine, which uses fixed-length row format. VARCHAR and VARBINARY column values are padded to the maximum column length, in effect storing them as CHAR and BINARY columns.
On-disk temporary tables are managed by the InnoDB or MyISAM storage engine (depending on the internal_tmp_disk_storage_engine setting). Both engines store temporary tables using dynamic-width row format. Columns take only as much storage as needed, which reduces disk I/O, space requirements, and processing time compared to on-disk tables that use fixed-length rows.
For statements that initially create an internal temporary table in memory, then convert it to an on-disk table, better performance might be achieved by skipping the conversion step and creating the table on disk to begin with. The big_tables variable can be used to force disk storage of internal temporary tables.
In some cases, the server creates internal temporary tables while processing statements. Users have no direct control over when this occurs.
The server creates temporary tables under conditions such as these:
UNION
statements, with some exceptions described later.TEMPTABLE
algorithm,UNION
, or aggregation.ORDER BY
clause and a differentGROUP BY
clause, or for which theORDER BY
orGROUP BY
contains columns from tables other than the first table in the join queue.DISTINCT
combined withORDER BY
may require a temporary table.SQL_SMALL_RESULT
modifier, MySQL uses an in-memory temporary table, unless the query also contains elements (described later) that require on-disk storage.INSERT ... SELECT
statements that select from and insert into the same table, MySQL creates an internal temporary table to hold the rows from theSELECT
, then inserts those rows into the target table. See Section 13.2.5.1, “INSERT ... SELECT Statement”.UPDATE
statements.GROUP_CONCAT()
orCOUNT(DISTINCT)
expressions.To determine whether a statement requires a temporary table, use
EXPLAIN
and check theExtra
column to see whether it saysUsing temporary
(see Section 8.8.1, “Optimizing Queries with EXPLAIN”).EXPLAIN
will not necessarily sayUsing temporary
for derived or materialized temporary tables.Some query conditions prevent the use of an in-memory temporary table, in which case the server uses an on-disk table instead:
BLOB
orTEXT
column in the table. This includes user-defined variables having a string value because they are treated asBLOB
orTEXT
columns, depending on whether their value is a binary or nonbinary string, respectively.SELECT
list, ifUNION
orUNION ALL
is used.SHOW COLUMNS
andDESCRIBE
statements useBLOB
as the type for some columns, thus the temporary table used for the results is an on-disk table.The server does not use a temporary table for
UNION
statements that meet certain qualifications. Instead, it retains from temporary table creation only the data structures necessary to perform result column typecasting. The table is not fully instantiated and no rows are written to or read from it; rows are sent directly to the client. The result is reduced memory and disk requirements, and smaller delay before the first row is sent to the client because the server need not wait until the last query block is executed.EXPLAIN
and optimizer trace output reflects this execution strategy: TheUNION RESULT
query block is not present because that block corresponds to the part that reads from the temporary table.These conditions qualify a
UNION
for evaluation without a temporary table:UNION ALL
, notUNION
orUNION DISTINCT
.ORDER BY
clause.{INSERT | REPLACE} ... SELECT ...
statement.Internal Temporary Table Storage Engine
An internal temporary table can be held in memory and processed by the
MEMORY
storage engine, or stored on disk by theInnoDB
orMyISAM
storage engine.If an internal temporary table is created as an in-memory table but becomes too large, MySQL automatically converts it to an on-disk table. The maximum size for in-memory temporary tables is defined by the
tmp_table_size
ormax_heap_table_size
value, whichever is smaller. This differs fromMEMORY
tables explicitly created withCREATE TABLE
. For such tables, only themax_heap_table_size
variable determines how large a table can grow, and there is no conversion to on-disk format.The
internal_tmp_disk_storage_engine
variable defines the storage engine the server uses to manage on-disk internal temporary tables. Permitted values areINNODB
(the default) andMYISAM
.Note
When using
internal_tmp_disk_storage_engine=INNODB
, queries that generate on-disk internal temporary tables that exceedInnoDB
row or column limits return Row size too large or Too many columns errors. The workaround is to setinternal_tmp_disk_storage_engine
toMYISAM
.When an internal temporary table is created in memory or on disk, the server increments the
Created_tmp_tables
value. When an internal temporary table is created on disk, the server increments theCreated_tmp_disk_tables
value. If too many internal temporary tables are created on disk, consider increasing thetmp_table_size
andmax_heap_table_size
settings.Internal Temporary Table Storage Format
In-memory temporary tables are managed by the
MEMORY
storage engine, which uses fixed-length row format.VARCHAR
andVARBINARY
column values are padded to the maximum column length, in effect storing them asCHAR
andBINARY
columns.On-disk temporary tables are managed by the
InnoDB
orMyISAM
storage engine (depending on theinternal_tmp_disk_storage_engine
setting). Both engines store temporary tables using dynamic-width row format. Columns take only as much storage as needed, which reduces disk I/O, space requirements, and processing time compared to on-disk tables that use fixed-length rows.For statements that initially create an internal temporary table in memory, then convert it to an on-disk table, better performance might be achieved by skipping the conversion step and creating the table on disk to begin with. The
big_tables
variable can be used to force disk storage of internal temporary tables.