读mysql45讲第一天

读mysql45讲第一天,第1张

读mysql45讲第一天


连接器部分的权限验证只是这个人有没有权限登录么?涉及到访问用户有没有权限访问sql中用到的表么?
查询缓存部分,是如何去判断要执行的sql是缓存中有的了?sql语句全部存一遍然后进行比较?
优化器具体优化的是什么了?和sql优化有什么区别?类似于java中的指令重排么?
执行器去 *** 作引擎,大概是怎么 *** 作的?
存储引擎中的数据都是以什么形式存储的?

大体上,mysql可以分为server层和引擎层

mysql中有许多加密函数,但是mysql8中已经移除了很多加密函数。

不同存储引擎的表的存取数据的方式是不一样的,功能也有所区别,在创建表的时候,用engine=InnoDB指定表的引擎,默认是InnoDB引擎。
在使用数据库的前提需要你登录数据库,这个时候就用到了 连接器。连接器负责和客户端建立连接,维护连接,获取权限,管理连接。

成功之后,获取到的权限就会一直在这个连接中使用,如果在当前连接还有效的时候,给用户修改了权限,需要断开连接重新连接才会使用新的权限。

如果连接之后,没有执行任务,就会处于空闲状态,使用show processlist命令可以查看当前和使用数据库的连接。如下截图:


Command列中值为sleep就表示处于空闲状态,空闲时间超过wait_timeout时间之后会自动断开连接,可以查看wait_timeout配置的时间:

但是这里7200的单位不知道是什么,正常应该都是秒吧,要是是分钟的话那就是120个小时(这不扯犊子嘛),单位应该就是秒,那就是2个小时。

长连接:客户端连接到数据库之后,持续会发出请求;短连接是指和数据库连接之后,仅仅发出几个请求之后就处于空闲状态。

但是长连接会比较耗费mysql的占用内存,因为mysql执行过程中的内存是放在连接对象中的,只有在连接断开之后,才会去清除掉内存。

如果长连接一直存活者,就会导致占用的内存越来越多,被系统强行杀掉。从现象看就是mysql因为异常重启了。

如何解决长连接导致mysql重启的问题?
1.定时去断开长连接,释放内存,然后重新连接。
2.可以在执行完一个耗费比较多资源的sql之后,通过调用mysql_reset_connection来重新初始化连接资源,调用完之后,会释放内存,缓存也会失效,回到刚开始连接的状态。

查询缓存失效的的 *** 作频率非常高,对表的一次更新 *** 作会使这个表上的所有缓存记录都失效,如果一个表很少会更新,插入等 *** 作,适合用缓存,比如配置表什么的。
缓存是以查询语句的hash作为key,查询结果作为value,以key-value形式去存的,但是如果sql语句大小写变了,或者加了注释,导致sql语句的hash值变了,就会导致不会命中缓存。
mysql8之前可以配置query_cache_type参数关闭掉查询缓存的功能,mysql8将整块查询缓存的功能给删掉了。
分析器

在查询缓存没有命中只会,分析器就会开始起作用了。首先是“词法分析”,它会把你写的select识别出来这一个查询关键字,会把写在from后面的week识别是表名
把id识别成列id。。。;词法分析出各个关键字之后,就会进行语法分析,判断语法中是不是存在问题,通常都会见的“You have an error in your SQL syntax”报错。就是
语法中存在问题。

优化器

在分析器过后,mysql就会知道你的sql具体是想查什么了,在真正开始执行之后还需要优化器的优化器优化处理。在这个表有多个索引的时候,优化器去决定使用哪些索引,
或者有个join表的 *** 作,优化器会去判断优先根据什么条件去先后关联。

select  *
from week w
join week w2 on w2.id = w.id
where w.id = 2
and w2.id = 6

可以先根据w.id = 2的条件到w表中查询出值,再去和w2表进行关联,再执行w2.id=6,到w2表中找到id等于6的数据;
也可以会先根据w2.id=6先去到w2表中找到id等于6的值,再去和w表进行关联,找到w.id=2的值。

虽然执行结果是一样的,但是可能执行效率是不一样的(这个为了省事用的同一张表,应该用不同表)。优化器的作用就是决定采用哪一个执行方案。

执行器

在经过优化器之后,到了执行器就准备开始执行了

select  *
from week w
where w.id  =6

在开始查询之前,先进行查询有没有这个表的权限,没有权限直接抛出错误,有的话继续执行。调用使用的引擎接口去查询。

1.调用InnoDB引擎接口去查询表数据的第一行,判断id值是不是等于6,是的话就放到结果集,不是就跳过

2.调用引擎接口去取下一行的数据,再次进行判断

3.一直执行到这个表数据的最后一行,将结果集中的数据返回。

如果要查询的列是有索引的,会调用InnoDB引擎的“取满足条件中的第一行”接口,然后再去循环调用“满足条件的下一行”;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5707902.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存