[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The table_cache
, max_connections
, and max_tmp_tables
server variables affect the maximum number of files the server keeps open.
If you increase one or more of these values, you may run up against
a limit imposed by your operating system on the per-process number of
open file descriptors. You can increase the open-files limit on many
operating systems, though the method varies widely from system to system.
Consult your operating system documentation to determine whether it is
possible to increase the limit and how to do so.
table_cache
is related to max_connections
. For example,
for 200 concurrent running connections, you should have a table cache size of
at least 200 * n
, where n
is the maximum number of tables
in a join. You also need to reserve some extra file descriptors for
temporary tables and files.
Make sure that your operating system can handle the number of open file
descriptors implied by the table_cache
setting. If
table_cache
is set too high, MySQL may run out of file
descriptors and refuse connections, fail to perform queries, and be very
unreliable. You also have to take into account that the MyISAM
storage
engine needs two file descriptors for each unique open table. You can
increase the number of file descriptors available for MySQL with
the --open-files-limit=#
startup option. See section A.2.17 File Not Found.
The cache of open tables will be kept at a level of table_cache
entries. The default value is 64; this can be changed with the -O
table_cache=#
option to mysqld
). Note that MySQL may
temporarily open even more tables to be able to execute queries.
A not used table is closed and removed from the table cache under the following circumstances:
table_cache
entries and
a thread is no longer using a table.
mysqladmin refresh
or
mysqladmin flush-tables
.
FLUSH TABLES
statement.
When the table cache fills up, the server uses the following procedure to locate a cache entry to use:
A table is opened for each concurrent access. This means the table needs to be opened twice if two threads access the same table or if a thread accesses the table twice in the same query (for example, by joining the table to itself). The first open of any table takes two file descriptors; each additional use of the table takes only one file descriptor. The extra descriptor for the first open is used for the index file; this descriptor is shared among all threads.
If you are opening a table with the HANDLER table_name OPEN
statement, a dedicated table object is allocated for the thread.
This table object is not shared by other threads and is not closed
until the thread calls HANDLER table_name CLOSE
or the thread dies.
See section HANDLER
. When this happens, the table is put
back in the table cache (if the cache isn't full).
You can check if your table cache is too small by checking the mysqld
variable Opened_tables
. If this is quite big, even if you
haven't done a lot of FLUSH TABLES
, you should increase your table
cache size. See section Opened_tables
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |