According to the MySQL docs, you should set thread_cache_size
so that most new connections use threads from the cache rather than newly created threads. This saves some thread-creation overhead, though normally does not create a significant performance improvement:
Requests for threads are satisfied by reusing threads taken from the
cache if possible, and only when the cache is empty is a new thread
created. This variable can be increased to improve performance if you
have a lot of new connections. Normally, this does not provide a
notable performance improvement if you have a good thread
implementation. However, if your server sees hundreds of connections
per second you should normally set thread_cache_size high enough so
that most new connections use cached threads. (source)
This would mean that you should set your thread_cache_size
so that Threads_created / Connections
(the % of connections that lead to the creation of new threads) is rather low. If you take the MySQL docs literally ("most"), the value should be < 50%. RolandoMySQLDBA's answer says < 1%. I don't know who's closer to the truth.
You should not set thread_cache_size
higher than Max_used_connections
. The final sentence in RolandoMySQLDBA's answer ("At the very least, thread_cache_size should be greater than Max_used_connections") doesn't seem sensible because it says that you should keep more threads in the cache than your server ever uses. MySQL will never put that many threads in the cache anyway -- it does not pre-emptively put threads in the cache -- it only puts them there after a client creates a thread and disconnects. If you never have X clients connecting at the same time, you will never have X threads in the cache:
When a client disconnects, the client's threads are put in the cache
if there are fewer than thread_cache_size threads there. (source)
See also this answer by Michael:
Setting thread_cache_size to a value larger than max_connections seems
like tremendously unhelpful advice... the cache can't possibly grow
larger than max_connections and even a cache anywhere close to that
size could only make sense if you have a tremendous amount of churn on
your threads... which, in a well-behaved application, won't be the
case.
https://dba.stackexchange.com/a/28701