mysql原理
sql的执行过程
MySQL 8中一条SQL语句的执行过程可以详细分为以下几个步骤:
- 客户端与数据库建立连接
- 客户端通过TCP/IP协议(或其他协议)与MySQL服务器建立连接。
- 连接过程中,MySQL的连接器(Connector)负责接受连接请求,并进行身份验证和权限验证,确保客户端有足够的权限执行后续操作。
- 查询缓存(MySQL 8.0中已废弃)
- 在MySQL 8.0之前的版本中,如果启用了查询缓存,MySQL会检查查询缓存中是否已经存在与当前SQL语句完全相同的查询结果。
- 如果找到匹配的缓存结果,则直接返回缓存中的结果,避免后续的执行过程。
- 但需要注意的是,MySQL 8.0版本中默认已经废弃了查询缓存功能,因为查询缓存的维护和管理成本较高,且在高并发写入场景下效果不佳。
- 语法和语义分析
- 如果查询不命中缓存(或在MySQL 8.0中直接跳过查询缓存步骤),SQL语句会被传递给解析器(Parser)进行语法分析。
- 解析器会检查SQL语句的语法是否正确,比如关键字是否正确、括号是否配对等。
- 语法分析通过后,解析器还会进行语义分析,检查表、列、函数等对象是否存在,以及用户是否有足够的权限访问这些对象。
- 优化器生成执行计划
- 经过语法和语义分析后,SQL语句会被传递给优化器(Optimizer)。
- 优化器会根据统计信息和数据库的规则,生成多个可能的执行计划。这些计划可能包括不同的索引选择、连接顺序、筛选条件等。
- 优化器的目标是选出最优的执行计划,以提高查询性能。
- 执行器执行查询
- 优化器选择出最优的执行计划后,会将其传递给执行器(Execution Engine)。
- 执行器负责根据执行计划执行具体的查询操作。它会调用存储引擎的接口,从磁盘或内存中读取数据,并进行联接、过滤、排序等操作。
- 执行过程中,执行器会与存储引擎进行交互,获取或修改数据。
- 存储引擎处理数据
- 存储引擎(Storage Engine)是MySQL的核心组件之一,负责实际的数据存储和访问操作。
- 根据执行器的请求,存储引擎会从磁盘或内存中读取或写入数据,并返回给执行器。
- MySQL支持多种存储引擎,如InnoDB、MyISAM等,每种存储引擎都有其独特的特点和适用场景。
- 返回结果给客户端
- 执行器将查询结果返回给连接器。
- 连接器将结果发送回客户端,完成整个执行过程。
总结
MySQL 8中一条SQL语句的执行过程涉及多个组件的协同工作,包括连接器、解析器、优化器、执行器和存储引擎等。通过这些组件的紧密配合,MySQL能够高效地执行SQL语句,并返回查询结果给客户端。需要注意的是,在MySQL 8.0版本中,查询缓存功能已经被废弃,因此在实际应用中不再考虑该步骤。
query cache
查询缓存存储 SELECT 查询的结果,以便将来收到相同的查询时,可以快速返回结果。
这在高读取、低写入环境中非常有用(例如大多数网站)。它在多核机器的高吞吐量环境中扩展性不佳,因此默认情况下处于禁用状态。
设置query cache
查看服务器是否支持query cache
sql
show variables like 'have_query_cache';通过变量启用或者禁用query cache
sql
# 查看全局变量是否启用query cache
show global variables like 'query_cache_type';
# 查看session变量是否启用query cache
show session variables like 'query_cache_type';
# 当前session启用query cache
set session query_cache_type=1;
# 当前session禁用query cahce
set session query_cache_type=0;查询query cache大小,mariadb-10.4.19默认大小为64m
sql
select @@query_cache_size