外观
MySQL 执行查询的过程
MySQL
执行查询的过程如下:
客户端发送查询请求
- 客户端(如
MySQL
客户端工具、应用程序等)将SQL
语句发送到MySQL
服务器。
- 客户端(如
连接器
建立连接:连接器负责处理客户端与MySQL服务器之间的连接。它会检查用户是否具有权限执行该SQL语句。
验证用户:连接器会验证用户名和密码,确认用户是否有权限访问数据库和执行操作。
选择数据库:如果
SQL
语句中指定了数据库(如USE mydatabase;
),连接器会切换到对应的数据库。
查询缓存
- 如果查询结果已经被缓存,
MySQL
会直接从缓存中返回结果,而无需再次执行查询。
- 如果查询结果已经被缓存,
解析器
语法分析:解析器接收
SQL
语句后,会检查语句的语法是否正确。如果语法有误,会直接返回错误。语义分析:解析器会进一步分析
SQL
语句的语义,确认表名、列名等是否合法,以及是否符合MySQL
的语法规则。
预处理器
重写SQL语句:预处理器会对
SQL
语句进行一些简单的优化,例如展开视图、处理UNION
操作等。标准化:将
SQL
语句转换为统一的格式,方便后续处理。
查询优化器
生成执行计划:查询优化器是整个查询执行过程中最重要的部分之一。它会根据多种因素(如表的大小、索引的存在与否、统计信息等)生成最优的执行计划。
选择访问路径:优化器会决定是通过全表扫描、索引扫描还是其他方式来访问数据。
确定连接顺序:对于多表连接的查询,优化器会决定表的连接顺序,以最小化查询成本。
重写查询:优化器可能会对SQL语句进行进一步的优化,例如将子查询转换为连接操作等。
执行器
执行计划:执行器根据优化器生成的执行计划,调用存储引擎的接口来获取数据。
调用存储引擎:执行器会根据表的存储引擎(如
InnoDB
、MyISAM
等)调用相应的接口来执行查询操作。返回结果:执行器将查询结果返回给客户端。
存储引擎
数据存储与检索:存储引擎负责实际的数据存储和检索操作。不同的存储引擎有不同的实现方式。
InnoDB:支持事务、行级锁、外键等高级特性。
MyISAM:不支持事务,但查询速度较快。
其他引擎:如
Memory
、Archive
等,各有其特定用途。
返回结果
- 执行完成后,
MySQL
服务器将查询结果返回给客户端。
- 执行完成后,
过程如图所示:
注:MySQL
的查询缓存是一个可选的特性,用于缓存查询结果。它的主要目的是提高重复查询的性能。但MySQL 8.0已废弃查询缓存,这是因为查询缓存虽然在某些场景下可以提高性能,但在高并发和数据频繁更新的场景下,其维护成本较高,反而可能导致性能下降。如果需要缓存机制,建议使用应用层缓存(如Redis
、Memcached
)或其他中间件。