在我们平时的开发之中,SQL 是避免不了的,随着工作年限的增加熟练度也是成正比的,但是一条SQL是怎么执行的却又可能还不怎么清楚。
以MySQL为例大致可以分为七步:
一、查询缓存
当我们运行一条SQL语句的时候,首先会查询缓存中是否有数据(查询条件与上次完全一致),如果缓存中已经有了上次查询的数据就直接把缓存中的数据返回「8.0 取消了缓存机制」。如果不想让我们查询的数据存储到缓存的话,可以加上 SQL_NO_CACHE 来跳过缓存,如:select SQL_NO_CACHE * from table 。
二、解析器
当缓存中没有想要的数据时,就会查询数据库表中的数据。接下来就会对这条SQL进行语法解析,比如 有没有 select from 等关键字,以及关键字的位置 是否正确,简单来讲 就会按照SQL的语法要求就行解析,不符合的话就直接返回错误信息。符合的话就会生成语法树。
三、预处理器
符合SQL语法要求之后就会检查SQL中的列名、表名是否存在且正确,然后再进行权限验证,就是当前用户是否有权限对这个表进行相关的操作。
四、查询优化器
我们一般写SQL都是根据自己的习惯来书写,但是MySQL也许并不认为我们写的顺序(比如多个条件先执行哪一个)是最好的,执行最快的。所以它会根据自己的判断调整SQL 以达到他认为执行最快的顺序。当然如果使用STRAIGHT_JOIN 关联两张表,就会直接以前表为基表查询后面关联的表,不再做优化。
五、执行计划
查询优化器优化SQL之后就会生成执行计划
六、查询执行引擎
根据执行计划茶村数据
七、API查询接口
供执行引擎调用,查询表中的数据。