以Oracle为例
- 检查 语法、语义,关键字、列名表名错误等等,由系统报错。
- 接着是检查 权限,用户是否有权限访问该数据。
- 然后是 共享池检查,共享池类似缓存池,缓存SQL语句和它的执行计划,通过SQL语句的hash值来寻找执行计划,找到走软解析,找不到走硬解析。
- 软解析直接走"执行器",硬解析走优化器:生成解析树和执行方案,再走"执行器"。
如何增加软解析的可能: 使用绑定变量,缺点就是不会走优化器,执行方案不够优化
// 硬解析:
NSString *sql = @"SELECT * FROM myTable WHERE name = John";
// 绑定变量
NSString *sql = @"SELECT * FROM myTable WHERE name = ?";
FMResultSet *result = [db executeQuery:sql, @"John"];
解析MySQL执行SQL语句的过程
整个流程和Oracle一样,也是经过解析器、查权限、查缓存、优化器、执行器。只是顺序不一样,MySQL最大的不同就是存储引擎采用的是插件的形式来使用的,设计表的时候可以根据数据的不同选择合适的存储引擎,不同的表可以用不同的引擎,可以自定义存储引擎。
网友评论