解析MySQL基础架构:从Server层到存储引擎的工作原理

93 阅读3分钟

基础架构

mysql由mysql-server层和 mysql引擎组成

server层,由连接器、查询缓存、分析器、优化器、执行器组成。

存储引擎层,主要提供数据存储,读写接口;架构是插件式的。

server层

连接器

顾名思义,连接器将我们的请求和mysql连接,并提供了建立连接、获取权限、维持和管理连接的功能。

tips

  1. 使用时,尽量减少长连接动作,长连接会消耗mysql占用的内存。
  2. 如果内存急剧上涨,常见上线时,与mysql建立大量链接导致,这时候需要断开链接

查询缓存(mysql8.0已删除功能)

查询缓存是,把sql的结果缓存起来,下次同sql可以快速返回结果。

但查询缓存的维度是表级别,所以经常会缓存失效,导致缓存命中率很低。

分析器

分析器用于分析sql词法和语法的正确性,不正确则不执行。

词法分析

词法分析,顾名思义。就是用于分析sql里,哪些是词,然后这个词是不是类型,比如select,就代表查询类型.

一个错误的词,可能会被当成普通标识词,所以也可能不会报错,比如select 少打了一个e slect

语法分析

语法分析,在词法分析的基础上。已经知道了哪些词是什么,然后判断这个位置,放这个类型的词对不对,有没有缺什么关键词。

比如elect * from t ,第一个应该是elect,发现不是关键词,就会报语法错误

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

优化器

表里有多个索引,优化器会判断用哪个索引,提升执行效率

  • SELECT:查询优化器会根据查询条件、索引等信息生成最优的执行计划,可能会利用索引直接定位到需要的数据,然后按照执行计划逐步从存储引擎中获取数据并返回给客户端,并非将表中所有数据都提取出来后再筛选。
  • UPDATE:根据WHERE条件,优化器走索引,确定需要更新的记录,涉及到索引查找等操作来定位记录。找到记录后,才会对数据进行更新操作,更新操作会在存储引擎层对数据页进行修改等操作,并不是先把所有数据取出来更新完再放回去。
  • INSERT:会根据表结构和插入的数据,确定插入的位置。如果有索引,还需要考虑对索引的影响,可能会先检查是否有唯一键等约束条件,然后将数据插入到合适的位置,也不是先提取数据。
  • DELETE:同样会根据WHERE条件定位要删除的记录,利用索引等快速找到记录后,在存储引擎中标记或直接删除记录,而不是先把数据全部提取出来再判断哪些要删除。

执行器

执行器,开始调用innodb引擎,逐行提取、判断、存储/过滤。 mysql> select * from T where ID=10;

  1. 提取表T第一行,判断where是否满足;是,则存储进结果集;不是,过滤。
  2. 调用下一行,重复1
  3. 将上述行组装结果集,然后返回给客户端