InnoDB使用操作系统线程来处理用户事务请求,它是这样工作的:当InnoDB收到一个用户的请求时,如果已经超过innodb_thread_concurrency预先设置的并发线程数量,那么就会按照innodb_thread_sleep_delay预先设定的值休眠N秒,之后再次尝试连接,重试两次的机制是为了减少CPU上下文切换的次数,以降低CPU消耗。如果请求被接受了,则会获得一个innodb_concurrency_tickets默认500次的通行证,在这些次数用完之前,该线程重新请求时无须再进行前面所说的innodb_thread_concurrency的检查。如果还没有被接受,那么就会进入队列中,直到最终被处理掉。
从MySQL5.5.X版本开始,innodb_thread_concurrency被默认设置为0,表示不限制并发数,表1-2中是该参数的历史默认值。
表1-2 innodb_thread_concurrency参数默认值
InnoDB Version MySQL Version Default value Default limit of concurrent threads Value to allow unlimited threads
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 storage engine before 1.0.3 (corresponding to Plugin) 8 8 0
InnoDB storage engine 1.0.3 and newer (corresponding to Plugin) 0 No limit 0
注意
innodb_thread_concurrency = 0时,innodb_thread_sleep_delay参数就无效了。同样innodb_concurrency_tickets也没了意义,这里推荐设置innodb_thread_concurrency为0,这样可以更好地发挥CPU多核处理能力,提高并发量。
关于innodb_thread_concurrency参数的介绍,请参见MySQL5.5手册: