The key buffer (variable key_buffer_size
)
is shared by all threads; other buffers used by the server
are allocated as needed. See
Section 7.5.2, “Tuning Server Parameters”.
-
Each connection uses some thread-specific space:
A stack (default 192KB, variable
thread_stack
)
A connection buffer (variable
net_buffer_length
)
A result buffer (variable
net_buffer_length
)
The connection buffer and result buffer are dynamically
enlarged up to max_allowed_packet
when
needed. While a query is running, a copy of the current
query string is also allocated.
All threads share the same base memory.
When a thread is no longer needed, the memory allocated to
it is released and returned to the system unless the thread
goes back into the thread cache. In that case, the memory
remains allocated.
Before MySQL 5.1.4, only compressed
MyISAM
tables are memory mapped. As of
MySQL 5.1.4, the myisam_use_mmap
system
variable can be set to 1 to enable memory-mapping for all
MyISAM
tables.
Section 5.2.2, “Server System Variables”.
Each request that performs a sequential scan of a table
allocates a read buffer (variable
read_buffer_size
).
When reading rows in an arbitrary sequence (for example,
following a sort), a random-read
buffer (variable
read_rnd_buffer_size
) may be allocated in
order to avoid disk seeks.
-
All joins are executed in a single pass, and most joins can
be done without even using a temporary table. Most temporary
tables are memory-based hash tables. Temporary tables with a
large row length (calculated as the sum of all column
lengths) or that contain BLOB
columns are
stored on disk.
If an internal heap table exceeds the size of
tmp_table_size
, MySQL handles this
automatically by changing the in-memory heap table to a
disk-based MyISAM
table as necessary. You
can also increase the temporary table size by setting the
tmp_table_size
option to
mysqld, or by setting the SQL option
SQL_BIG_TABLES
in the client program. See
Section 13.5.3, “SET
Syntax”.
Most requests that perform a sort allocate a sort buffer and
zero to two temporary files depending on the result set
size. See Section A.4.4, “Where MySQL Stores Temporary Files”.
Almost all parsing and calculating is done in a local memory
store. No memory overhead is needed for small items, so the
normal slow memory allocation and freeing is avoided. Memory
is allocated only for unexpectedly large strings. This is
done with malloc()
and
free()
.
For each MyISAM
table that is opened, the
index file is opened once; the data file is opened once for
each concurrently running thread. For each concurrent
thread, a table structure, column structures for each
column, and a buffer of size 3 ×
N
are allocated (where
N
is the maximum row length, not
counting BLOB
columns). A
BLOB
column requires five to eight bytes
plus the length of the BLOB
data. The
MyISAM
storage engine maintains one extra
row buffer for internal use.
For each table having BLOB
columns, a
buffer is enlarged dynamically to read in larger
BLOB
values. If you scan a table, a
buffer as large as the largest BLOB
value
is allocated.
Handler structures for all in-use tables are saved in a
cache and managed as a FIFO. By default, the cache has 64
entries. If a table has been used by two running threads at
the same time, the cache contains two entries for the table.
See Section 7.4.8, “How MySQL Opens and Closes Tables”.
A FLUSH TABLES
statement or
mysqladmin flush-tables command closes
all tables that are not in use at once and marks all in-use
tables to be closed when the currently executing thread
finishes. This effectively frees most in-use memory.
FLUSH TABLES
does not return until all
tables have been closed.