MySQL学习01——一条SQL语句的执行
概览
MySQL 可以分为 Server 层和存储引擎层两部分。
连接器
连接器负责
学习MySQL时,需要了解MySQL是如何执行一条SQL语句的,通过执行过程了解MySQL的内部架构,这里以select语句为例。 概览 MySQL 可以分为 Server 层和存储引擎层两部分。 连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。 MySQL数据库属于服务端,我们的应用程序属于客户端,当我们要操作数据库时,需要将应用程序连接到数据库,连接器主要负责这项工作。 建立连接需要用户名和密码,当用户名、密码都认证通过后,连接器还需要查询你的用户拥有的权限,后续select、update、delete等语句的权限判断逻辑都依赖连接时读到的权限。所以如果要修改用户权限,需要重新建立连接。 1、如何建立连接?
-p后面应该接密码,但是不建议在shell语句中显示的输入密码。 执行上述语句后,就需要在交互对话框中输入密码。 2、如何查看连接?
连接信息以表的形式呈现。 3、长连接问题? 由于建立连接的过程还是有一定消耗,所以我们不希望每次执行SQL语句都要重新建立一次连接。MySQL使用的长链接的方式建立连接,建立连接成功后,当前客户端的请求都会使用这一个连接。如果客户端长时间不工作,连接器会主动断开连接,断开连接后,客户端需要重新建立连接才能与数据库进行交互。 但是所有的客户端都适用长连接的话,MySQL的内存会涨很快,这是由于MySQL在执行每个客户端的请求时,使用的内存都管理在每个连接对象中,这些资源只有断开连接时才会释放,所以连接越多,内存消耗就越大。有两个方案可以解决这个问题: 查缓存 每次执行完的SQL语句,其结果都会以k-v形式存到缓存中,key就是查询语句,value是查询结果。这样方便下次使用同样的SQL语句时能够直接在缓存中获取数据。 在实际应用中,该功能大概率会起到反效果。每次执行SQL语句后,需要将结果存到内存中,但是每当更新数据库中的数据时,缓存都会失效,所以缓存命中率一般都很低。在8.0后的版本中,就不在支持查询缓存的功能了。 分析器 分析器先会做“词法分析”。词法分析会将select关键字、代表表名的字符串、代表列ID的字符串都识别成计算机能识别的方法或变量。之后进行“语法分析”,根据词法分析得到的结果,判断SQL语句是否满足MySQL的语法,如果不满足会抛出异常。 优化器 分析器可以让MySQL直到SQL语句的功能mssql 内部连接,但是在开始执行之前,还需要进行优化,让SQL语句执行的效率更高。 比如:表有多个索引时,需要选择更快的索引。 优化器执行完成后,SQL语句的执行方案就确定下来了。 执行器 优化器确定执行方案后,执行器会执行语句。 首先判断用户是否有操作这个表的权限,这个权限就是在连接过程中确定的。根据表的引擎定义,调用表中指定引擎的接口。如果执行方案中使用了索引,会根据索引找到对应的结果,否则只会根据查询条件遍历表,找到所有满足条件的结果。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |