MySQL学习笔记(一) :一条SQL查询语句的执行过程

MySQL的组成

MySQL可以分为Server层和存储引擎层

    Server层实现MySQL大多数核心服务功能(触发器、视图) 存储引擎层实现数据的存储和提取 常见的存储引擎有:InnoDB(MySQL默认)、MyISAM、Memory

不同的存储引擎共用一个Server层

Server层

1. 连接器

连接器负责和客户端建立连接、获取权限、维持和管理连接。 连接步骤:

  1. 完成TCP握手
  2. 连接器使用输入的用户名和密码进行用户身份验证
  3. 认证通过后,连接器从权限表中查出用户拥有的权限
  4. 成功建立连接(在此期间,用户权限不会变化)

连接的分类: 如果客户端长时间没有发送请求,连接器会自动断开连接 (由参数wait_timeout控制,默认值8小时)

    长连接:客户端持续有请求,一直使用同一个连接 短连接:每执行几次查询就断开连接,有新的查询需要重新再建立连接

连接建立过程比较复杂,尽量减少建立连接的次数,即尽量多使用长连接。但是全部使用长连接有可能出现MySQL占用内存较大的情况,因为MySQL执行过程中使用的内存在连接对象里面,这些资源只有在连接断开时才会释放,需要定期断开长连接

2. 查询缓存

MySQL执行过的查询语句及其结果会以key-value(key是查询语句,value是查询结果)的形式直接缓存在内存中。

当MySQL拿到一个查询请求后会先到查询缓存中查看是否执行过此条语句,如果能在缓存中找到key,则直接返回对应的value

查询缓存的优缺点:

    优点:如果命中查询缓存,MySQL不需要重复执行复杂操作,直接返回查询结果,效率提高 缺点:每更新一个表的内容,这个表所有的查询缓存全部清空,查询缓存的命中率极低(这一点也说明查询缓存更适合查找频繁但更新极少的“静态表”)

(MySQL 8.0之后将查询缓存功能全部删除)

3. 分析器

对SQL语句进行解析,先进行“词法分析”,再进行“语法分析”。

  1. 词法分析——MySQL需要识别出SQL语句中的字符串是什么、代表什么。 举例: select ID from T MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符 串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。
  2. 语法分析——语法分析器根据规则,判断SQL语句是否满足MySQL语法

4. 优化器

当表有多个索引时,需要决定使用哪个索引;当一个语句有多表关联时,需要决定各表的连接顺序

    索引: 一般使用唯一值更多的索引 表的连接顺序: 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。 两种方法执行结果一致,但是效率会有所不同,优化器需要选出效率更高的方法

5. 执行器

先判断用户对该表有无查询的权限,如果没有则返回没有权限错误;如果有则继续执行。 执行器根据建表时的引擎定义,使用对应引擎提供的接口

当ID段没有索引时,执行器具体执行过程:

  1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如 果是则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

参考

极客时间《MySQL实战45讲》 01

经验分享 程序员 微信小程序 职场和发展