图片来自Mysql实战45讲01

Mysql结构

详细解释

  • Mysql 分为Server层和存储引擎层。
  • Server层包括连接器、分析器、优化器和执行器,涵盖大多数核心功能,以及所有内置函数,所有跨存储引擎的功能都在这一层,比如存储过程、触发器、视图。
  • 存储引擎层负责数据的存储和提取,是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。(5.5.5版本开始默认InnoDB)
  • 不同存储引擎共用一个Server层

Server层

连接器

  • 连接数据库时处理请求的就是连接器,负责跟客户端建立连接、获取权限、维持和管理连接。
  • 连接命令mysql -h$ip -P$port -u$user -p
  • 当用户名和密码认证通过后,连接器会到权限表查出该用户拥有的权限,之后,此连接的权限判断逻辑,都以此时为准。
  • 数据库里面长连接指连接成功后,若客户端一直有请求,则使用同一个连接;短连接时指每次执行完很少的几次查询就断开连接,下次查询再重新建立连接。
  • 建立连接过程比较复杂,建议尽量使用长连接。
  • 但是长连接多了会导致内存占用太大,可以考虑定期断开长连接,或者程序判断执行了一个占用内存过大的查询后,进行断开;
  • 如果是5.7或更高版本,可以在执行一次比较大操作后,执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态

查询缓存

  • mysql拿到查询请求后,会先到查询缓存看看是否执行过这个语句,之前执行的语句可能会以k-v形式存在内存中。k是查询语句,v是查询结果。如果有则直接返回(返回前会做权限验证)。
  • 如果没有命中,则会执行后续操作,并将结果放到缓存中。
  • 缓存的失效和更新频率有关,只要有对该表的更新,该表相关查询缓存都会被清空。
  • query_cache_type 设置成 DEMAND,表示查询语句默认不用缓存,确定要使用缓存的可以使用SQL_CACHE显式指定,语法SELECT SQL_CACHE * FROM TABLE
  • 8.0版本开始不再支持查询缓存。

分析器

  • 没有命中缓存,则开始真正执行。
  • 分析器先进行词法分析,识别里面的关键字,如SELECT。表名、列名等(没有表没有列时会报错)。
  • 然后进行语法分析,判断是否符合mysql语法。

优化器

  • 有多个索引时,决定使用哪个索引。或者有JOIN时,决定表连接顺序。
  • select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20 既可以先从t1中取c=10的行,根据ID关联到t2,然后判断t2.d是否等于20;也可以先从t2取d=20的行,根据ID关联到t1,再判断t1.c是否等于10。

执行器

  • 开始执行前,先判断对该表是否有查询权限。
  • 执行时,调用存储引擎提供的接口,如取表的第一行,判断ID值是不是10;取下一行,执行相同判断。最后将所有满足条件的行组成的结果集返回给客户端。
  • 如果有索引,则取表的第一行,判断ID值是不是10变为调用存储引擎接口取满足条件的第一行取下一行,执行相同判断变为调用存储引擎接口取满足条件的下一行

相关文章:

  • 2021-11-09
  • 2022-12-23
  • 2021-11-20
  • 2021-11-09
  • 2021-04-01
  • 2021-10-03
  • 2021-06-10
  • 2021-03-29
猜你喜欢
  • 2021-08-06
  • 2021-09-20
  • 2021-12-25
  • 2021-06-14
  • 2022-02-07
  • 2022-12-23
  • 2021-08-11
相关资源
相似解决方案