MySQL实战45讲学习笔记:第一讲

1、MySQL逻架构图

2、链接器工做原理刨析

一、链接器工做原理图

 

二、原理图说明

一、链接命令mysql

mysql -h$ip -P$port -u$user -p

二、查询连接状态sql

三、长链接端链接

一、什么是长连接?

数据库里面,长链接是链接成功后,若是客户端持续有请求,则一直使用同一个连接。数据库

二、什么是短链接?

短链接则是指每次执行完不多的几回查询就断开链接,下次查询从新创建一个缓存

三、尽可能使用长连接

创建链接的过程一般是比较复杂的,因此我建议你在使用中尽可能减小创建的动做,也就是使用长链接bash

3、使用长连接困惑及解决方案

一、为何MySQL占用内存涨得特别快

可是所有是用长链接后,你可能会发现,有些时候MySQL占用内存涨得特别快,架构

这是由于MySQL在执行过程当中临时使用的内存管理在链接对象里面的,这些资源会在链接断开的时候才释放,性能

因此若是长连接积累下来,可能致使内存占用大,被系统强行杀掉,从现象看就是MySQL异常重启了优化

二、如何解决MySQL占用内存涨得特别快

一、按期断开长连接,使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开链接,以后要查询再链接spa

二、若是你用的是MySQL5.7或更新版本,能够在每次执行一个比较大的操做后,经过执行设计

mysql_reset_connection

来从新初始化链接资源,这个过程不须要重连或从新作权限验证,可是会将链接回复到刚刚建立完时的状态

4、查询缓存

一、工做流程刨析图解

 

 

  1. MySQL拿到一个查询请求后,会先到查询缓存看看,以前是否是执行过这条语句,若是有,就直接返回给客户端
  2. 若是语句不在查询缓存中,就会继续后面的执行阶段。
  3. 执行完成后,执行结果会被存入查询缓存中,
  4. 若是查询命中缓存MySQL不须要执行后面的复杂操做,就能够直接返回结果,这个效率会很高

二、为何大多数状况下比建议使用查询缓存?

一、查询缓存的失效很是频繁,只要有一个表更新,这个表上全部的查询缓存都被清空
二、对于更新压力大的数据库来讲,查询缓存的命中率会很是低,
三、除非你的业务就是有一张静态表,很长时间才会更新一次(好比一个系统配置表)

一、默认语句不实用查询缓存

MySQL提供的按需使用的方式

query_cache_type 设置成 DEMAND

二、肯定须要查询缓存的语句

mysql> select SQL_CACHE * from T where ID=10;

MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始完全没有这个功能了。

 5、分析器

若是你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,
好比下面这个语句select 少打了开头的字母“s”

mysql> elect * from t where ID=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to 
your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1

通常语法错误会提示第一个出现错误的位置,因此你要关注的是紧接"use naar"的内容

6、优化器

一、优化器的做用

一、在表里面有多个索引的时候,决定使用哪一个索引

二、多表关联(ioin)的时候,决定各个表的连接顺序

二、举例说明

mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;

既能够先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于20
也能够先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于10

这两种执行方法的逻辑结果时同样的,可是执行的效率会有不一样,而优化器的做用就是决定选择哪个方案

7、执行器

一、工做原理

 

 

二、举例说明


一、没有索引的执行流程

一、调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是否是1,若是不是则跳过,若是是则将这行存在结果集中
二、调用引擎接口取"下一行",重复相同的判断逻辑,直到取到这个表的最后一行
三、执行器将上述遍及过程当中全部知足条件的行组成的记录集做为结果集返回给客户端。

二、有索引的执行流程

第一调用的是"取知足条件的第一行"这个接口,
以后循环取"知足条件的下一行"

引擎扫描行数跟rows_examined并非彻底相同的

8、思考题

一、题目

若是表 T 中没有字段 k,而你执行了这个语句 select* from T where k=1, 那确定是会报“不存在这个列”的错误:

“Unknown column ‘k’ iin ‘where clause’”。

你以为这个错误是在咱们上面提到的哪一个阶段报出来的呢?

二、答案

 

我认为是优化器的,优化器会进行优化分析,好比用先执行哪一个条件,使用哪一个索引。若是没有对应的字段就会报错的,我看其余评论说是执行器,缘由是这个时候才打开表获取数据,可是表的字段不是数据啊,是事先定义好的,因此能够直接读取的,不须要打开表。这是个人见解,但愿老师点评一下是否正确

 

做者回复: “不是执行器”这一点,你分析得很好😄

 

课后答案:分析器。Oracle会在分析阶段判断语句是否正确,表是否存在,列是否存在等。猜想MySQL也这样。

做者回复: MySQL确实在设计上受Oracle影响颇深。就是这样哈,分析器作了这个工做。另外有评论里面举例高性能MySQL 里面概念的同窗、说正文里面已经暗示答案的同窗,远程点赞了哈😄😄 就喜欢大家这么机智的回答👍🏿

相关文章
相关标签/搜索