InnoDB
使用操作系统 线程 来处理用户事务的请求。(事务可能在提交或回滚之前向 InnoDB
发出多个请求。)在现代操作系统和多核处理器的服务器上,CONTEXT 切换效率高,绝大多数工作负载可以在不限制并发线程数的情况下运行良好。
在需要最小化线程之间的 CONTEXT 切换的情况下,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
而减少 CONTEXT 切换开销,而不受 innodb_thread_concurrency
设置的限制。由于 SQL 语句(例如连接)可能包含多个行操作,因此 InnoDB
将分配指定数量的“票”,以便线程可以以最小的开销被重复调度。
当新的SQL语句开始时,线程没有票据,必须遵守innodb_thread_concurrency
。一旦线程被允许进入InnoDB
,它将被分配一定数量的票据,以便在随后进入InnoDB
执行行操作。如果票据用完,线程将被驱逐,并且innodb_thread_concurrency
将被再次遵守,可能将线程放回等待线程的先进先出队列中。当线程再次被允许进入InnoDB
时,票据将被重新分配。分配的票据数量由全局选项innodb_concurrency_tickets
指定,默认为5000。等待锁定的线程在锁定可用时将获得一张票据。
这些变量的正确值取决于您的环境和工作负载。尝试不同的值范围,以确定哪个值适合您的应用程序。在限制并发执行线程的数量之前,请查看可能改善InnoDB
在多核和多处理器计算机上的性能的配置选项,例如innodb_adaptive_hash_index
。
有关MySQL线程处理的常规性能信息,请参阅第7.1.12.1节,“连接接口”。