SELECT * FROM orders
WHERE customer_id = 100
AND order_date > '2023-01-01';
优化器需要决定:
先用customer_id索引,再用order_date过滤?
还是反过来?
还是全表扫描?
5. 执行计划生成
将优化后的逻辑计划转为物理执行计划:
选择具体算法(Hash Join vs. Nested Loop Join)
确定数据访问路径(索引扫描 vs. 全表扫描)
确定排序和聚合方法
6. 执行引擎执行
按照执行计划逐步执行:
从存储引擎读取数据
应用过滤条件
执行连接操作
排序和分组
返回结果
二、具体示例分析
以MySQL的SELECT * FROM users WHERE id = 10;为例:
语法分析:检查结构 → SELECT * FROM users WHERE id = 10; 符合SELECT语句格式
语义分析:检查users表是否存在,id列是否存在
优化器:发现id是主键,决定使用主键索引直接查找
执行计划:Index Lookup using PRIMARY执行:从存储引擎(如InnoDB)的B+树索引中找到id=10的记录
返回结果:将记录返回给客户端