1、优化思路
当我们发现了一个慢SQL的问题的时候,需要做性能优化,一般我们是为了提高SQL查询更快,一个查询的流程由下图的各环节组成,每个环节都会消耗时间,要减少消耗时候需要从各个环节都分析一遍。
2 连接配置优化
第一个环节是客户端连接到服务端,这块可能会出现服务端连接数不够导致应用程序获取不到连接。
"MySQL error 1040 "Too many connections" 指的是你的数据库服务器达到了它的最大连接数限制。这通常发生在数据库服务器同时处理了太多的客户端连接请求时。
1、服务端:从服务端来说可以增加连接数,如果多个应用或者请求同时访问数据库,连接数不够的时候可以设置连接数更大些。
-- 修改最大连接数,当有多个应用连接的时候
SHOW VARIABLES LIKE 'max_connections';
2、服务端:及时释放不活动的连接,交互式和非交互式的客户端默认超时时间都是28800秒,8小时,我们可以把值调小
-- 及时释放不活动的连接,注意不要释放连接池还在使用的连接
SHOW VARIABLES LIKE 'wait_timeout';
3、客户端:减少从服务端获取的连接数,如果想要不上每一次执行SQL都创建一个新的连接,我们可以使用数据库连接池,实现连接的复用。比如dbcp、c3p0、阿里Druid、Hikari(springboot 2.x版本默认的连接池)
连接池也不是越大越好,只要维护好一定数量大小的连接池,其他客户端排队等待获取连接就可以了,有的时候连接池越大,效率反而越低。
Druid默认最大连接池大小是8,Hikari默认最大连接池大小是10。
一般建议连接池大小是机器核数乘以2+1,也就是说4核的机器,连接池维护9个连接就够了,这个公式从一定程度上来说对其他数据库也是适用的。
每一个连接,服务端都是需要创建一个线程来处理它的,连接数越多,服务端创建的线程数就会越多。创建连接会消耗时间消耗资源;而且在CPU同时执行执行超过核数的线程是通过分配时间片以及上下文切换方式实现的。CPU的核数是有限的,频繁的上下文切换会造成比较大的开销。
所以在修改数据库的配置的时候需要结合部署服务器的配置,比如服务器的CPU、内存、磁盘、网络。在不同硬件支撑下MySQL的配置也不尽相同。
参数名称 | 案例值 |