The following list indicates some of the ways that the mysqld
server
uses memory. Where applicable, the name of the server variable relevant
to the memory use is given:
key_buffer_size
) is shared by all
threads; other buffers used by the server are allocated as
needed. See section 5.5.2 Tuning Server Parameters.
thread_stack
), a connection buffer (variable
net_buffer_length
), and a result buffer (variable
net_buffer_length
). The connection buffer and result buffer are
dynamically enlarged up to max_allowed_packet
when needed. When
a query is running, a copy of the current query string is also allocated.
ISAM
/ MyISAM
tables are memory mapped. This
is because the 32-bit memory space of 4 GB is not large enough for most
big tables. When systems with a 64-bit address space become more
common we may add general support for memory mapping.
record_buffer
).
record_rnd_buffer
).
HEAP
)
tables. Temporary tables with a big record length (calculated as the
sum of all column lengths) or that contain BLOB
columns are
stored on disk.
One problem in MySQL versions before Version 3.23.2 is that if a HEAP
table exceeds the size of tmp_table_size
, you get the error The
table tbl_name is full
. In newer versions this is handled by
automatically changing the in-memory (HEAP
) table to a disk-based
(MyISAM
) table as necessary. To work around this problem, you can
increase the temporary table size by setting the tmp_table_size
option to mysqld
, or by setting the SQL option
BIG_TABLES
in the client program. See section 5.5.6 SET
Syntax. In MySQL Version 3.20, the maximum size of the
temporary table was record_buffer*16
, so if you are using this
version, you have to increase the value of record_buffer
. You can
also start mysqld
with the --big-tables
option to always
store temporary tables on disk. However, this will affect the speed of
many complicated queries.
malloc()
and
free()
).
3 * n
is
allocated (where n
is the maximum row length, not counting BLOB
columns). A BLOB
uses 5 to 8 bytes plus the length of the BLOB
data. The ISAM
/MyISAM
storage engines will use one extra row
buffer for internal usage.
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.
mysqladmin flush-tables
command closes all tables that are not in
use and marks all in-use tables to be closed when the currently executing
thread finishes. This will effectively free most in-use memory.
ps
and other system status programs may report that mysqld
uses a lot of memory. This may be caused by thread-stacks on different
memory addresses. For example, the Solaris version of ps
counts
the unused memory between stacks as used memory. You can verify this by
checking available swap with swap -s
. We have tested
mysqld
with commercial memory-leakage detectors, so there should
be no memory leaks.