本文仅用于个人的复习输出。
mysql的查询语句大体可以分为这几个步骤:连接,查缓存,解析语法,进行查询。
1、连接 连接就是查询者使用用户名和密码登录mysql。连接使用TCP协议进行连接。
mysql会保存好当前登录用户的权限,在本次连接中所有的操作都会根据这个权限来进行判断。哪怕在操作过程中被管理员修改了权限,只要连接不断,mysql还是会根据保存的权限状态(建立连接时确认的权限)进行操作。
在mysql中,连接分为短连接和长连接两种。两者区别就是短连接执行完一次sql之后就会断开,而长连接可以执行多个。一般情况下会选择使用长连接。因为使用短连接的话会进行大量的tcp握手挥手,消耗资源。但使用长连接也不是完美的,使用长连接,每个连接的占用内存会越来越大,最后可能会导致mysql占用内存过大被系统强制关闭。所以使用长连接时我们可以用这两种方法解决:(1)定期断开长连接(2)客户端重置连接,mysql提供了重置的方法接口,当mysql进行了一次大操作后就可以执行这个接口来重置连接。重置不是断开,不会重连或重新校验用户权限,只是将状态切换到连接刚建立的时候。
2、查缓存
就是查询一下之前是否有过相同sql语句的查询,如果有就将记录的结果返回,没有就继续执行下面的步骤。这个操作有些鸡肋,因为一旦数据库发生了修改缓存就会被清除,所以在写多的数据库中作用很小,在mysql 8.0版本中被移除。
3、解析语法。
解析分为两个步骤:词法解析和语法解析。
词法解析就是从sql语句中提取出关键词和非关键词。关键词比如说select,from等,非关键词就比如表名,列名。
语法解析会根据词法解析的结果构建出语法树,根据sql的语法规则判断语法是否合规。这样会方便后续的操作。
4、进行查询
这里可以分为三步:预处理,优化,执行。
预处理做的事:(1)查看sql语句缩写的表,列是否存在。(2)将*替换为所有列名。
优化:确认sql语句的执行方案,比如确认使用哪个索引来查询。
执行:按照优化器的结果,执行器与引擎交互。
以上,就是mysql的大体执行逻辑。