MySQL优化思路

246 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

SQL语句执行顺序

以下是一条查询 SQL 语句是如何执行的流程图。根据流程图的顺序进行分析MySQL的优化思路。

image.png

连接-配置优化

第一个环节是客户端连接到服务端,连接这一块有可能会出现什么样的性能问题?有可能是服务端连接数不够导致应用程序获取不到连接。比如报了一个 Mysql: error 1040: Too many connections 的错误。

可以从两个方面来解决连接数不够的问题:

1、从服务端来说,我们可以增加服务端的可用连接数。

如果有多个应用或者很多请求同时访问数据库,连接数不够的时候,我们可以: (1)修改配置参数增加可用连接数,修改 max_connections 的大小:

show variables like 'max_connections'; -- 修改最大连接数,当有多个应用连接的时候

(2)或者,或者及时释放不活动的连接。交互式和非交互式的客户端的默认超时时间都是 28800 秒,8 小时,我们可以把这个值调小。

show global variables like 'wait_timeout'; --及时释放不活动的连接,注意不要释放连接池还在使用的连接

2、从客户端来说,可以减少从服务端获取的连接数,如果我们想要不是每一次执行 SQL 都创建一个新的连接,可以引入连接池,实现连接的重用。

缓存-架构优化

缓存

在应用系统的并发数非常大的情况下,如果没有缓存,会造成两个问题:一方面是会给数据库带来很大的压力。另一方面,从应用的层面来说,操作数据的速度也会受到影响。

我们可以用第三方的缓存服务来解决这个问题,例如 Redis。

image.png

集群 主从复制

如果单台数据库服务满足不了访问需求,那我们可以做数据库的集群方案。

image.png

image.png

做了主从复制的方案之后,我们只把数据写入 master 节点,而读的请求可以分担到 slave 节点。我们把这种方案叫做读写分离。

image.png

读写分离可以一定程度地减轻数据库服务器的访问压力,但是需要特别注意主从数据一致性的问题。

分库分表

垂直分库,减少并发压力。水平分表,解决存储瓶颈。

垂直分库的做法,把一个数据库按照业务拆分成不同的数据库:

水平分库分表的做法,把单张表的数据按照一定的规则分布到多个数据库。