总的来说就是C/S架构,脑手分离,先说Server层:

当走到执行器这一步服务层并不会实际执行,而是通过一套统一接口来调用存储引擎层,存储引擎只关心数据的读写

引擎层是插件化设计,可以调整使用不同的存储引擎,默认是InnoDb:

详细图:

优化器每次选的索引都是正确的吗?

一条SQL的执行顺序

我们一般书写的顺序是:SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT。但是执行顺序是这样的:

FROM -> ON -> JOIN -> WHERE -> GROUP BY -> WITH ROLLUP -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT

注意:这是逻辑顺序,不是物理执行顺序。优化器可能重排执行计划

举一个例子来说明,参考:

具体的过程:

客户端连接 → 解析SQL(生成语法树) → 预处理(语义校验) → 优化(生成执行计划) → 执行(调用存储引擎) → 返回结果