Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Configuring Thread Concurrency for InnoDB

17.8.4 InnoDB 配置线程并发

InnoDB 使用操作系统线程处理来自用户事务的请求。 (事务可能会在提交或回滚前向 InnoDB 发出许多请求。) 在现代操作系统和多核处理器服务器上,where 上下文切换是高效的,大多数工作负载都可以不受线程并发限制地运行。

在某些情况下,如果有助于最小化线程之间的上下文切换,InnoDB 可以使用一些技术来限制同时执行的操作系统线程数量(因此限制了任何时候处理的请求数量)。当 InnoDB 接收来自用户会话的新请求,如果当前执行的线程数量达到预定义的限制,新的请求将睡眠一段短时间,然后再次尝试。等待锁定的线程不计入同时执行的线程数量。

您可以通过设置配置参数innodb_线程并发来限制线程并发。一次执行的线程数量达到这个限制后,额外线程将睡眠指定微秒数(由配置参数innodb_线程睡眠延迟设置),然后被放入队列。

您可以将配置选项innodb_adaptive_max_sleep_delay设置为innodb_thread_sleep_delay的最高值,并且InnoDB将根据当前线程调度活动自动调整innodb_thread_sleep_delay的值。这使得线程调度机制在系统轻载和近满负荷时工作顺滑。

InnoDB和隐含的默认限制对并发线程数量的变化在MySQL和InnoDB的不同版本中进行了更改。innodb_thread_concurrency的默认值为0

InnoDB只有在并发线程数量受限时才会使线程睡眠。当没有对线程数量的限制时,所有线程都将平等竞争被调度。也就是说,如果innodb_thread_concurrency0innodb_thread_sleep_delay的值将被忽略。

当线程数量存在限制(当innodb_thread_concurrency大于0时),InnoDB通过允许多个在执行单个SQL语句期间的请求进入InnoDB,从而减少上下文切换开销。由于一个SQL语句(例如join)可能包含多个行操作在InnoDB中,因此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节,“连接接口”