二话不说,先上图!

image.png

连接器

连接数据库的第一步就是对接连接器,连接器负责跟客户端建立连接、获取权限、维持和管理连接。

数据库长连接:

如果客户端持续有请求,则一直使用同一个连接。

数据库短连接:

每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

建立连接过程是比较复杂的,建议在使用中尽量减少建立连接的动作,尽量使用长连接

使用长连接的问题:

内存占用问题:MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放,所以如果长练级连接累积下来,可能导致内存占用太大,被系统强行杀掉。

解决办法

  1. 定期断开长连接
  2. MySQL5.7及之后版本,在每次执行一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源

    查询缓存

    当执行的是查询语句,建立完连接后,执行逻辑就会“查询缓存”,MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。有就直接返回,没有就继续后面的执行阶段,执行完之后结果会被存入查询缓存中。

    缓存格式

    key-value:key是查询语句,value是查询的结果。

    缓存失效

    只要有对一个表的更新,这个表上所有的查询缓存都会被清空,对于更新压力大的数据库来说,查询缓存的命中率会非常低,除非业务就是一张静态表,很长时间才会更新一次。

大多数情况下建议不使用查询缓存,因为查询缓存往往弊大于利。

按需使用

设置参数:query_cache_type=DEMAND,查询语句使用SQL_CACHE显示指定:select SQL_CACHE * from T where id=10

注意:MySQL 8.0版本就直接将查询缓存的整块功能删除掉了

分析器 (词法分析、语法分析)

如果查询没有命中查询缓存,就要开始真正执行语句了,执行语句MySQL要知道你打算做什么。

词法分析

分析器先做“词法分析”,你需要识别出SQL里面的字符串分别是什么,代表什么,例如分析出“select”关键字,这是一个查询语句。

语法分析

做完“词法分析”后,就要做“语法分析”根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法规范,如果语句不对,就会收到You have an error in your SQL syntax的错误提醒。

优化器

  • 在表里有多个索引的时候,决定使用哪个索引
  • 在一个语句有多表join的时候,决定各个表的连接顺序

    执行器

    执行语句调用存储引擎API接口,要先判断有没有对表T的执行权限,如果没有,就会返回没有权限的错误(工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证)