InnoDB uses operating system
threads to process requests
from user transactions. (Transactions may issue many requests to
InnoDB before they commit or roll back.) On
modern operating systems and servers with multi-core processors,
where context switching is efficient, most workloads run well
without any limit on the number of concurrent threads. Scalability
improvements in MySQL 5.5 and up reduce the need to limit the
number of concurrently executing threads inside
InnoDB.
In situations where it is helpful to minimize context switching
between threads, InnoDB can use a number of
techniques to limit the number of concurrently executing operating
system threads (and thus the number of requests that are processed
at any one time). When InnoDB receives a new
request from a user session, if the number of threads concurrently
executing is at a pre-defined limit, the new request sleeps for a
short time before it tries again. A request that cannot be
rescheduled after the sleep is put in a first-in/first-out queue
and eventually is processed. Threads waiting for locks are not
counted in the number of concurrently executing threads.
You can limit the number of concurrent threads by setting the
configuration parameter
innodb_thread_concurrency.
Once the number of executing threads reaches this limit,
additional threads sleep for a number of microseconds, set by the
configuration parameter
innodb_thread_sleep_delay,
before being placed into the queue.
The default value for
innodb_thread_concurrency and the
implied default limit on the number of concurrent threads has been
changed in various releases of MySQL and
InnoDB. The default value of
innodb_thread_concurrency is
0, so that by default there is no limit on the
number of concurrently executing threads, as shown in
Table 14.3, “Changes to innodb_thread_concurrency”.
Table 14.3 Changes to innodb_thread_concurrency
| InnoDB Version | MySQL Version | Default value | Default limit of concurrent threads | Value to allow unlimited threads |
|---|---|---|---|---|
| Built-in | Earlier than 5.1.11 | 20 | No limit | 20 or higher |
| Built-in | 5.1.11 and newer | 8 | 8 | 0 |
| InnoDB before 1.0.3 | (corresponding to Plugin) | 8 | 8 | 0 |
| InnoDB 1.0.3 and newer | (corresponding to Plugin) | 0 | No limit | 0 |
InnoDB causes threads to sleep only when the
number of concurrent threads is limited. When there is no limit on
the number of threads, all contend equally to be scheduled. That
is, if innodb_thread_concurrency
is 0, the value of
innodb_thread_sleep_delay is
ignored.
When there is a limit on the number of threads (when
innodb_thread_concurrency is >
0), InnoDB reduces context switching overhead
by permitting multiple requests made during the execution of a
single SQL statement to enter
InnoDB without observing the limit set by
innodb_thread_concurrency.
Since an SQL statement (such as a join) may comprise multiple row
operations within InnoDB,
InnoDB assigns a specified number of
“tickets” that allow a thread to be scheduled
repeatedly with minimal overhead.
When a new SQL statement starts, a thread has no tickets, and it
must observe
innodb_thread_concurrency.
Once the thread is entitled to enter InnoDB, it
is assigned a number of tickets that it can use for subsequently
entering InnoDB to perform row operations. If
the tickets run out, the thread is evicted, and
innodb_thread_concurrency
is observed again which may place the thread back into the
first-in/first-out queue of waiting threads. When the thread is
once again entitled to enter InnoDB, tickets
are assigned again. The number of tickets assigned is specified by
the global option
innodb_concurrency_tickets,
which is 500 by default. A thread that is waiting for a lock is
given one ticket once the lock becomes available.
The correct values of these variables depend on your environment
and workload. Try a range of different values to determine what
value works for your applications. Before limiting the number of
concurrently executing threads, review configuration options that
may improve the performance of InnoDB on multi-core and
multi-processor computers, such as
innodb_use_sys_malloc and
innodb_adaptive_hash_index.
For general performance information about MySQL thread handling, see Section 8.12.5.1, “How MySQL Uses Threads for Client Connections”.