要掌握MySQL的性能优化技术,首先我们就要对MySQL的总体架构和各个模块的功能于作用有个整体的认识和了解,再逐层深入,才能更加牢固的掌握,形成自己的知识体系。
总体来看,MySQL可划分为连接层、SQL处理层、存储引擎层这三层,当然,MySQL的数据文件和日志文件最终是存放到文件系统中,因此MySQL最底层是文件系统,但文件系统属于操作系统,可以不算在MySQL的架构中。
首先我们需要认识到一点,数据库的连接层并非MySQL所独有,任何的数据库系统都有这一层逻辑,只不过实现逻辑各异。连接层主要实现连接处理、权限管理、安全认证等功能。
MySQL连接层包含Connectors、Enterprise Management Serveices & Utilities和Connection Pool这三个功能模块,下面我们一次来讲讲这三个功能模块的具体作用。
此模块包含连接和访问MySQL数据库系统的各种客户端,如我们最常用的JDBC,还有如图给出的Python、Native C API、ODBC等不同实现的客户端。
此模块提供了MySQL的系统管理和控制工具,同时,也实现了MySQL的身份验证和权限校验,当一个用户通过客户端连接到MySQL服务器,服务器需要对其进行身份验证,也就是用户名、IP、密码验证,一旦连接成功,还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的某个操作)。
连接池的工作原理是,当MySQL启动(MySQL服务就是一个进程),等待客户端连接,每接收到一个客户端连接请求,MySQL服务器都会新建一个线程来处理(如果是线程池,则是分配一个空的线程),每个线程相互独立,且拥有各自的内存处理空间(注意是内存空间,不是磁盘)。但需要注意的是,如果这个请求只是查询数据,那不会发生数据同步问题,但是如果涉及到修改数据,当两个线程修改同一块内存时,则会引发数据同步问题。
除此以外,连接池允许我们通过max_connections参数,设置MySQL的最大连接数,MySQL默认最大连接数为151。
show VARIABLES like '%max_connections%';
set GLOBAL max_connections = 200
准确的说,SQL处理层包含SQL Interface(SQL接口)、Parser(SQL解析器)、Optimizer(SQL优化器)、Caches&Buffers(缓存)这四个功能模块。
此模块定义和实现了DML、DDL等我们操作和定义MySQL数据的SQL语言功能。也实现了MySQL的存储过程、视图、触发器、函数以及MySQL内置函数。这部分是我们平时使用MySQL数据库系统的过程中,接触最多的部分,也是MySQL数据库系统中,最核心的功能模块之一。
解析查询,创建一个内部数据结构(解析树),这个解析树主要用来完成SQL语句的语义与语法解析。MySQL并不会按照我们书写的SQL规范和顺序,来完成数据的存取,而是会按照它内部所定义的一套SQL解析规范,来解析SQL,这样MySQL数据库系统才能识别。这就好比计算机不认识我们人类的语言,所有的人类语言,都要转换成0101这样的二进制字节码它才能认识。
下面就是MySQL解析的SQL解析树,也就是MySQL对我们书写的SQL的解析规则:
优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何运行的,便于用户重构查询和修改相关配置,以达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息、是否对特定索引有查询优化等。
MySQL会缓存查询的SQL文本以及结果数据在内存中,当执行相同的SQL时,MySQL会优先从缓存中查询结果,如果命中,则直接向客户端返回结果,如果未命中,MySQL再解析、优化、执行SQL,从数据库中查询数据。
MySQL的SQL文本缓存是默认开启的,且外界无法干预(也就是说我们不能去手动关闭它),但MySQL的查询结果缓存,默认是关闭的,我们可以手动的去关闭和开启。
show variables like '%query_cache_type%';
MySQL的缓存开关,在MySQL的配置文件中,通过设置query_cache_type = 1(开启)或者0(关闭)控制,设置完成重启MySQL服务即可。
SET GLOBAL query_cache_size = 4000
或者在配置文件中,设置query_cache_size = 4000,重启服务即可。