数据库中如何执行 SQL 语句?
下图显示了这一过程。请注意,不同数据库的架构各不相同,下图展示了一些常见的设计。
图片
第 1 步 - 通过传输层协议(如 TCP)向数据库发送 SQL 语句。
第 2 步 - 将 SQL 语句发送到命令解析器,在那里进行语法和语义分析,然后生成查询树。
第 3 步 - 将查询树发送给优化器。优化器会创建一个执行计划。
生成执行计划:解析器将语法树交给查询优化器。查询优化器的任务是优化 SQL 查询的执行方式,生成一个执行计划。执行计划决定了数据库如何从存储中读取数据、如何连接不同的表、如何使用索引等。优化器会尝试选择最有效的执行路径,可能会考虑以下因素:
- 使用索引扫描(index scan)。
- 如何连接表(如使用 nested loop join、hash join、merge join 等)。
- 选择不同的操作顺序。
成本估算:优化器基于数据库的统计信息(如表的大小、索引的选择性等)来估算不同执行计划的成本,选择最优的方案。
第 4 步 - 将执行计划发送给执行器。执行过程中,数据库会根据需要访问磁盘或缓存中的数据。如果查询需要使用索引,数据库会通过索引访问数据;如果查询没有使用索引,可能会进行全表扫描。
第 5 步 - 访问方法提供执行所需的数据获取逻辑,从存储引擎获取数据。
第 6 步 - 访问方法决定 SQL 语句是否只读。如果查询是只读的(SELECT 语句),则将其传递给缓冲区管理器进行进一步处理。缓冲区管理器会在缓存或数据文件中查找数据。
第 7 步 - 如果语句是 UPDATE 或 INSERT,则将其传递给事务管理器作进一步处理。
第 8 步 - 在事务处理期间,数据处于锁定模式。这是由锁管理器保证的。它还能确保事务的 ACID 属性。