当前位置: 首页 > 科技观察

MySQL系列:一句SQL,MySQL是怎么工作的?

时间:2023-03-12 04:20:23 科技观察

对于MySQL来说,其实分为client和server。服务器是MySQL应用程序。当我们使用netstartmysql命令启动服务时,实际上是启动了MySQL服务器。客户端负责向服务器发送请求,并从服务器获取数据。客户端可以有多种形式,可以是我们通过mysql-uroot-p1234打开的黑窗,也可以是我们使用的Nativecat、SQLyogTools等数据库连接,甚至我们的程序,也可以称为MySQL客户端。而当我们在mysql窗口或者数据库连接工具中输入一句sql,就可以得到我们想要的数据。MySQL在中间是如何工作的?我们执行SQL之后,比如一个简单的select*fromuserwherename='yanger',客户端向服务端发送请求,请求到达Server层,会经过connector,querycache,analyzer,优化器、执行器等,最后通过存储引擎从文件系统中获取数据或向文件系统中插入数据。当客户端程序发起连接时,连接器需要携带主机信息、用户名和密码。服务器程序将验证客户端程序提供的信息。如果验证失败,服务器程序将拒绝连接。每个人都熟悉连接命令。mysql-h$ip-P$port-u$user-p输入命令后,需要继续输入密码。密码也可以直接跟-p,但是这样可能会导致你的密码泄露。如果你连接的是生产服务器,强烈建议你不要这样做。MySQL使用TCP作为服务器和客户端之间的网络通信协议。TCP握手完成后,连接器主要进行密码校验和权限获取。如果用户名和密码不正确,您将收到“用户拒绝访问”错误。如果用户名和密码通过了身份验证,连接器将检查您在权限表中拥有的权限。之后,本次连接中的权限判断逻辑将依赖于此时读取的权限。MySQL默认连接8小时,由参数wait_timeout控制。如果超过这个时间没有使用,会自动断开连接,并在运行过程中,抛出LostconnectiontoMySQLserverduringquery的错误。查询缓存针对的是查询语句。MySQL在收到一个查询请求后,首先会去查询缓存中查看这条语句之前是否执行过。之前执行的语句及其结果可以是键值对的形式。直接缓存在内存中。如果命中缓存,则直接返回结果。如果不在查询缓存中,则继续进行后续的执行阶段。执行完成后,执行结果会保存在查询缓存中。对于更新语句,包括insert和delete语句,当MySQL收到更新请求时,会清除querycache中与该表相关的所有缓存数据。我们可以看到只要有更新,缓存就会失效。对于正常的业务来说,更新其实是比较频繁的。也就是说MySQL的querycachehitrate不是很高,建议不要开启。.您可以通过将query_cache_type设置为DEMAND来关闭查询缓存。其实在MySQL8.0中,querycache的功能直接被去掉了。AnalyzerMySQL首先需要对SQL语句进行分析。分析过程本质上是一个编译过程,涉及词法分析、句法分析、语义分析等阶段。通过分析MySQL,你知道你想做什么。如果语句错误,您将收到“您的SQL语法有错误”的错误提示。一般语法错误会提示第一个错误位置,所以要注意“usenear”后面的内容。优化器面对分析器得到的结果,MySQL会做一些优化处理,比如当表有多个索引时决定使用哪个索引,或者当一条语句有多个表关联(join)时决定使用哪个索引.表的连接顺序。优化的结果是生成一个执行计划,该计划指示应该使用哪些索引进行查询,表与表之间的连接顺序是什么。我们可以使用EXPLAIN语句来查看一条语句的执行计划。这里的\G可以在命令窗口无法排成一行方便查看的情况下垂直显示结果。执行器通过分析器和优化器后,正式开始执行阶段。但是,在执行之前,需要进行权限验证。如果权限不足,会抛出权限错误。其实在查询缓存的时候,也会进行权限校验。如果验证通过,则执行者打开表并继续执行。打开表时,执行器会根据表的引擎定义使用引擎提供的接口。存储引擎MySQL支持多种存储引擎,常用的有InnoDB和MyISAM,MySQL默认的存储引擎是InnoDB。如果我们选择InnoDB引擎,对于查询,InnoDB会取表的第一行判断是否符合要求,如果符合要求,则存在于结果集中,否则继续下一行,直到表格的最后一行。然后存储引擎将结果返回给执行器,执行器将结果返回给客户端,这样就完成了一条SQL的执行。