Skip to content

mysql原理

sql的执行过程

MySQL 8中一条SQL语句的执行过程可以详细分为以下几个步骤:

  1. 客户端与数据库建立连接
  • 客户端通过TCP/IP协议(或其他协议)与MySQL服务器建立连接。
  • 连接过程中,MySQL的连接器(Connector)负责接受连接请求,并进行身份验证和权限验证,确保客户端有足够的权限执行后续操作。
  1. 查询缓存(MySQL 8.0中已废弃)
  • 在MySQL 8.0之前的版本中,如果启用了查询缓存,MySQL会检查查询缓存中是否已经存在与当前SQL语句完全相同的查询结果。
  • 如果找到匹配的缓存结果,则直接返回缓存中的结果,避免后续的执行过程。
  • 但需要注意的是,MySQL 8.0版本中默认已经废弃了查询缓存功能,因为查询缓存的维护和管理成本较高,且在高并发写入场景下效果不佳。
  1. 语法和语义分析
  • 如果查询不命中缓存(或在MySQL 8.0中直接跳过查询缓存步骤),SQL语句会被传递给解析器(Parser)进行语法分析。
  • 解析器会检查SQL语句的语法是否正确,比如关键字是否正确、括号是否配对等。
  • 语法分析通过后,解析器还会进行语义分析,检查表、列、函数等对象是否存在,以及用户是否有足够的权限访问这些对象。
  1. 优化器生成执行计划
  • 经过语法和语义分析后,SQL语句会被传递给优化器(Optimizer)。
  • 优化器会根据统计信息和数据库的规则,生成多个可能的执行计划。这些计划可能包括不同的索引选择、连接顺序、筛选条件等。
  • 优化器的目标是选出最优的执行计划,以提高查询性能。
  1. 执行器执行查询
  • 优化器选择出最优的执行计划后,会将其传递给执行器(Execution Engine)。
  • 执行器负责根据执行计划执行具体的查询操作。它会调用存储引擎的接口,从磁盘或内存中读取数据,并进行联接、过滤、排序等操作。
  • 执行过程中,执行器会与存储引擎进行交互,获取或修改数据。
  1. 存储引擎处理数据
  • 存储引擎(Storage Engine)是MySQL的核心组件之一,负责实际的数据存储和访问操作。
  • 根据执行器的请求,存储引擎会从磁盘或内存中读取或写入数据,并返回给执行器。
  • MySQL支持多种存储引擎,如InnoDB、MyISAM等,每种存储引擎都有其独特的特点和适用场景。
  1. 返回结果给客户端
  • 执行器将查询结果返回给连接器。
  • 连接器将结果发送回客户端,完成整个执行过程。

总结

MySQL 8中一条SQL语句的执行过程涉及多个组件的协同工作,包括连接器、解析器、优化器、执行器和存储引擎等。通过这些组件的紧密配合,MySQL能够高效地执行SQL语句,并返回查询结果给客户端。需要注意的是,在MySQL 8.0版本中,查询缓存功能已经被废弃,因此在实际应用中不再考虑该步骤。

query cache

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

todo 继续阅读官方文档学习query cache运行原理