-
客户端发送查询:客户端(例如 MySQL 客户端工具或应用程序)通过网络将 SQL 查询语句发送到 MySQL 服务器。
-
服务器接收查询:MySQL 服务器接收到客户端发送的查询语句,并进行初步处理。
-
解析器解析查询:
-
词法分析(Lexical Analysis):词法分析器(Lexer)将SQL语句拆分成一系列的词法单元(Tokens),每个词法单元是SQL语句的最小组成部分,如关键字、标识符、操作符和字面值等。
-
语法分析(Syntax Analysis):语法分析器(Parser)根据SQL语法规则,将词法单元序列解析成一个语法树(Parse Tree)或抽象语法树(Abstract Syntax Tree,AST)。语法树表示了SQL查询的结构和层次关系。
-
-
预处理器处理查询:
- 预处理器对解析树进行进一步的处理,例如进行权限检查,确保用户有权限执行该查询。
- 检查表和列是否存在,解析别名等。
- 查询优化器优化查询:
- 查询优化器(Optimizer)对解析树进行优化,生成执行计划(Execution Plan)。
- 优化器会考虑多种执行方案,选择代价最小的方案。这包括选择合适的索引、连接顺序等。
- 执行计划执行查询:
- 执行计划被传递给执行引擎(Execution Engine),执行引擎按照执行计划逐步执行查询操作。
- 执行过程中,执行引擎会访问存储引擎(Storage Engine)以读取或写入数据。
- 存储引擎访问数据:
- 不同的存储引擎(如 InnoDB、MyISAM 等)有不同的数据存储和检索机制。执行引擎通过存储引擎访问实际数据。
- 存储引擎会将数据从磁盘读取到内存中,进行必要的操作(如锁定行、读取索引等)。
- 执行引擎返回结果:
- 执行引擎将查询结果返回给 MySQL 服务器。
- 服务器将结果集进行处理,例如格式化输出等。
- 服务器返回结果给客户端:
- 处理后的结果集通过网络返回给客户端。
- 客户端接收到结果集,并进行相应的展示或处理。
- 清理和释放资源:MySQL 服务器清理此次查询过程中使用的资源,关闭相关连接,释放内存等。