咳咳分享七篇笔记,建议大家还是先去看看书看看专栏在查漏补缺一下,不介意新手看,主要是今天想摸鱼不想学习了,时不时更新
基础架构
-
1. MySQL可以分为Server层和存储引擎层两部分;server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖了大多数核心服务,以及所有的内置函数、跨存储印象的功能也在这一层(存储过程、触发器、试图等)
-
2. 储存引擎层复制数据的存储和提取 ,其架构模式是插件式的,目前最常用的引擎是innoDB== mysql5.5.5成为默认存储引擎
-
3.执行建表语句,不知道存储引擎类型默认使用innoDB, 可以指定别的存储引擎,比如 在建表语句中使用engine=memory,指定使用内存引擎常见表
-
4.不同的存储引擎公用一个Server层
1.连接器
-
1.一个用户成功建立连接后,即使用root对这个用户权限进行修改,不会影响已经存在连接的权限。只有新建的连接才会使用新的权限设置
-
2.连接完成后,如果没有后续动作,连接处于空闲状态,但仍可以在show processlist中看到。客户端太长时间没动静,连接器自动断开,时间由wait_timeout控制,默认时间为8小时
-
3.长连接指连接成功后,客户端持续请求,则一直使用同一个连接 ;短连接指每次执行很少几次查询后断开连接,下次查询重新建立连接。
建立连接过程复杂,使用中尽量避免 -
4.全部长连接,Mysql内存涨的很快,mysql执行过程中临时的内存是管理在连接对象里面的,资源在断开的时候释放。
长时间积累内存过大,会被系统强行OOM也就是杀掉,现象来看是mysql重启
解决方式:
1)定期断开长连接。或者程序内判断占用内存大查询后,断开连接,查询在重连。
2)如果用的是MySQL 5.7或更新版本,可以每次执行较大操作,通过mysql_reset_connection来重新初始化连接资源。过程不需要重连和重新权限验证,但会将连接恢复到刚创建的状态
2.查询缓存(执行命令逻辑)
-
1.mysql拿到查询请求,先查看内存缓存,是不是执行过改语句。
执行过的的语句及结果可能会以key value形式直接缓存到内存。
key是查询的语句,value是查询的结果
如果查询在缓存中找到key,value会直接返回客户端 -
2.如果语句不在查询缓存中,继续执行,执行结束存入查询缓存。 查询命中缓存,mysql不需要执行后面复杂操作,直接返回。
查询缓存弊大于利,失效频繁,对一个表进行更新,该表所有查询缓存都会被清空 -
3.按需使用:,将参数query_cache_type,对默认的sql都不是有查询缓存
确认使用查询缓存的语句,使用SQL
CACHE显式指定 如:
select SQL_CACHE * from T where ID=10;
mysql8.0删除了此功能没有了查询缓存
3.分析器(没有命中缓存,真正执行语句
- 没有命中缓存,分析器会词法分析,输入组成的查询语句,mysql需要识别字符串是什么代表什么。
4.优化器(分析后,进行优化器处理
- 优化器在表内有多个索引的时候,决定使用哪个索引,或者多表连接决定表的连接顺序,多种方法取效率最高的
5.执行器(优化后,执行
-
1.执行器执行前判断用户有没有执行查询权限
-
2.如果有权限打开表继续执行,打开表过程执行器根据表的引擎定义,使用对应提供的接口
-
3.在慢查询日志中看到rows
examined字段,表示语句执行扫描了多少行,此字段是执行器每次调用引擎获取行时累加的 -
4.一些场景,执行器调用一次,引擎内部扫描了多行,引擎扫描行数和rows
examined宾补完全相同