一条查询语句是如何执行的
- 一条SQL语句的执行流程是通过连接器验证账号、密码、权限,连接到MySQL
- 然后到缓存中查询以前有没有缓存过这条数据(因为数据库每次会将查询后的数据以key-value的形式存到缓冲中,key为查询语句,value为查询结果;但是每次在该表执行完更新操作后会清除该表的缓存,来保证数据的一致性。此外,查询缓存有一个缺点,就是在经常做更新操作的表中,查询语句的缓存命中率很低,而且在删除缓存的过程中会加锁,此时有一条语句进来进行查询操作,此时就会报出waiting for qurey cache lock错误,等待缓存清除完成。这里有一个解决方案,就是可以使用set @global_query_cache_type = 0,禁用查询缓存,0为禁用,1为开启,2为需要语句显式声明查询缓存,比如select SQL_cache * from t1就是一条显式声明查询缓存)
- 若缓存中没有数据,分析器就会进行词法分析和语句分析。词法分析主要是根据SQL语句,分析出操作哪张表的哪些字段以及操作条件;而语法分析主要是做SQL语法的分析,看语句有没有写错。
- 分析成功后,就会到优化器,优化器主要是根据SQL语句,看使用哪个索引或者选择连表顺序。
- MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误。