在MySQL社区版中,MySQL 默认使用 one-thread-per-connection 的方式来处理数据库连接。即当MySQL客户端与服务器端建立连接时会创建一个线程来专门处理该连接的所有SQL请求。

优点

one-thread-per-connection方式实现简单,在连接数较少或使用长连接的场景中有保证较小的响应时间。

缺点

在大量短连接或高并发场景下,one-thread-per-connection方式需要频繁地创建/销毁线程,并在大量线程间进行切换调度,产生较多的上线文切换(context-switch),导致系统出现性能问题。

线程池

在Percona,MariaDB,Oracle MySQL 企业版,以及阿里云polarDB中提中,提供了线程池特性。

目前Oracle MySQL的Thread pool实现为Plugin方式,并且只添加到在Enterprise版本中,Percona移植了MariaDB的Thread pool功能,并做了进一步的优化。

在线程池方案下,通过预先创建一定数量的线程,在监听到有新的请求时,线程池直接从现有的线程中分配一个线程来提供服务,服务结束后这个线程不会直接销毁,而是又去处理其他的请求。

这样就避免了线程和内存对象频繁创建和销毁,减少了上下文切换,提高了资源利用率,从而在一定程度上提高了系统的性能和稳定性。

线程池技术限制了并发线程数,相当于限制了MySQL的runing线程数,无论系统目前有多少连接或者请求,超过最大设置的线程数的都需要排队,让系统保持高性能水平,从而防止DB出现雪崩,对底层DB起到保护作用。

用户的每个连接不再对应一个线程。线程池由一系列 worker 线程组成,这些worker线程被分为thread_pool_size个group。用户的连接按 round-robin 的方式映射到相应的group 中,一个连接可以由一个group中的一个或多个worker线程来处理。