一条查询sql的执行流程

108 阅读2分钟

1.mysql逻辑组成

服务端+存储引擎

2.请求流程

3.服务端组成

连接器 -> 缓存 -> 分析器 -> 优化器 -> 执行器

4.连接器

4.1 作用

负责服务端和客户端建立连接,完成TCP握手后,认证身份,成功建立连接

4.2 注意点

1.若用户已经建立连接,在此期间修改用户的权限不会生效,需要重新连接后才生效

2.客户端默认休眠8小时后自动断开连接,由wait-timeout参数控制

3.使用showprocesslist命令可以查看已经建立连接的客户端及其状态

4.3 长连接问题

1.描述:当客户端连接后,建立长连接可以使所有请求都是用该连接,减少连接的开销

2.带来的问题:若用户长时间建立连接,会导致占用内存过大,可能会导致OOM情况

3.解决方式:定期断开长连接、执行mysql_reset_connection命令初始化连接资源

5.查询缓存

5.1缓存的结构

执行过的查询会以key-value的形式缓存在内存中,key为sql语句,value为查询结果

5.2缓存的弊端

当对表有更新操作时,所有跟次表有关的缓存都将清空,这样查询缓存的效率就会非常低,因此推荐不使用缓存,或者说不常更新的表使用缓存

5.3显式使用缓存

select SQL_CACHE * from table

5.4禁用缓存的指令

query_cache_type = DEMAND

6.分析器

6.1作用

分析语句的语法,看是否符合mysql的语法规则

7.优化器

7.1作用

假如有语句:select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;

可以用两种执行方式

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

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

优化器的作用就是分析那种执行方式的执行效率更高

8.执行器

8.1执行器的执行流程(无索引情况下)