InnoDB
使用操作系统线程处理来自用户事务的请求。(事务可以向InnoDB
在他们做出承诺或退缩之前。)在具有多核处理器的现代操作系统和服务器上,上下文切换是有效的,大多数工作负载运行良好,而不受并发线程数量的限制。
在某些情况下,减少线程之间的上下文切换是有帮助的,InnoDB
可以使用许多技术来限制并发执行的操作系统线程的数量(从而限制在任何时间处理的请求的数量)。当InnoDB
从用户会话接收一个新请求,如果并发执行的线程数达到预定义的限制,则新请求在再次尝试之前会休眠一小段时间。在休眠后不能重新调度的请求被放入先入先出队列并最终被处理。等待锁的线程不计算在并发执行线程的数量中。
可以通过设置配置参数限制并发线程数innodb_thread_concurrency
.一旦执行线程的数量达到此限制,其他线程将休眠若干微秒,这由配置参数设置innodb_thread_sleep_delay
,然后放入队列。
您可以设置配置选项innodb_adaptive_max_sleep_delay
到你允许的最大值innodb_thread_sleep_delay
,InnoDB
自动调整innodb_thread_sleep_delay
向上或向下,取决于当前线程调度活动。这种动态调整有助于线程调度机制在系统负载较轻和接近满负荷时顺利工作。
的默认值innodb_thread_concurrency
并发线程数的默认限制已经在MySQL和的不同版本中发生了变化InnoDB
.的默认值innodb_thread_concurrency
是0
,因此默认情况下,并发执行线程的数量没有限制。
InnoDB
仅当并发线程数受到限制时,才使线程进入睡眠状态。当线程数量没有限制时,所有线程都平等地争调度。也就是说,如果innodb_thread_concurrency
是0
的值。innodb_thread_sleep_delay
将被忽略。
当线程数量有限制时(当innodb_thread_concurrency
是> 0),InnoDB
的执行过程中允许多个请求,从而减少上下文切换开销单条SQL语句进入InnoDB
没有遵守所设定的极限innodb_thread_concurrency
.由于SQL语句(如连接)可能包含多个行操作InnoDB
,InnoDB
的指定数目”票”允许以最小的开销重复调度线程。
当一个新的SQL语句开始时,线程没有票据,它必须观察innodb_thread_concurrency
.一旦线程有资格进入InnoDB
,它被分配了一些门票,可以用于随后进入InnoDB
执行行运算。如果票用完,线程将被逐出,并且innodb_thread_concurrency
再次观察,这可能会将线程放回到等待线程的先入先出队列中。当线程再次有资格进入时InnoDB
,门票重新分配。分配的票据数量由全局选项指定innodb_concurrency_tickets
,默认为5000。等待锁的线程在锁可用时得到一张票。
这些变量的正确值取决于您的环境和工作负载。尝试一系列不同的值,以确定哪些值适合您的应用程序。在限制并发执行线程的数量之前,请检查可能提高性能的配置选项InnoDB
在多核和多处理器计算机上,例如innodb_adaptive_hash_index
.
有关MySQL线程处理的一般性能信息,请参见章节5.1.12.1,“连接接口”.