0%

基础架构

MySQL可以分为Server层(连接、鉴权、计算)和存储引擎层(读写、存取数据)两部分。

Server层

涵盖MySQL的大多数核心服务功能,以及所有的内置函数(日期、时间、数学、加密),所有跨存储引擎的功能(存储过程、触发器、视图)。

连接器

管理连接,权限验证

负责跟客户建立连接、获取权限(从权限表中获取并保存在变量中,供后续查询缓存、优化器、执行器等阶段权限校验时使用)、维持和管理连接。

mysql -h$ip -P$port -u$user -p

一个用户成功建立连接后,即使用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。只有新建的链接才会使用新的权限设置。

show processlist命令可查看当前存在的各连接列表及状态

客户端长时间没动静(wait_timeout默认8小时),连接器会自动断开。

wait_timeout是非交互式连接的空闲超时,interactive_timeout是交互式连接的空闲超时。执行时间不计入空闲时间。
connect_timeout是连接过程中的等待时间,wait_timeout是连接完成后,使用过程中的等待时间。

长连接:连接成功后,客户端持续有请求则一直使用同一个链接。
短连接:每次执行完很少的几次查询就断开链接,下次查询再重新建立一个。

衡量标准,一次连接持续期内,执行了多少个sql语句。

MySQL在执行过程中临时使用的内存是管理在连接对象里面的(大量数据排序、变量、复杂存储过程等),资源在连接断开时才释放。容易导致OOM。

  • 定期断开长连接。
  • 执行mysql_reset_connection(为编程语言提供的api,不是sql语句)重新初始化当前链接资源(MySQL5.7以上),不需要重连和重新做权限验证。

查询缓存

一种数据结构
命中则直接返回结果(MySQL8.0以上该功能删除)

MySQL拿到查询请求,先到查询缓存查看是否执行过。之前执行过的语句及其结果以key-value对的形式缓存在内存中。若有则直接返回给客户端。

查询缓存失效太频繁,对表的更新,会清空该表上所有的查询缓存。只适用于静态表(如系统配置表)。

query_cache_type=DEMAND不使用查询缓存。(或者query_cache_size=0)。
query_cache_limit单个结果集的大小上限;总量上限query_cache。
select SQL_CACHE * from test;显式指定该SQL使用查询缓存。

分析器

词法分析,语法分析
解决做什么的问题

词法分析:识别SQL语句中的字符串及其代表意义。(关键字验证和解析,查询语句/更新语句/删除语句;表名和字段名验证和解析,此处没有打开表,从information schema中直接读取,不需要打开表)。

语法分析:依据语法规则,根据词法分析的结果,判断输入的SQL是否满足MySQL语法。

You have an error in your SQL syntax;//错误时提示

优化器

执行计划生成,索引选择
解决怎么做的问题

多个索引决定使用哪个索引;多表连接决定各个表的连接顺序等。(同一条SQL多次执行,不会重用优化策略,每次都要重新优化)

扩展 index_merge(先筛选再join连接,MySQL暂不支持跨表)

执行器

操作引擎,返回结果

先判断用户对表的执行权限(命中查询缓存,返回结果时做权限验证;优化器前调用precheck验证权限;涉及触发器权限,只有在执行阶段才知道有哪些触发器)
无权限返回没有权限错误;有权限打开表(读取表的定义,获取表的结构)获取数据继续执行,根据表的引擎定义,使用对应引擎提供的接口。

  • 调用InnoDB引擎接口取表的第一行,判断where条件中对应字段的值是不是符合,不是则跳过,是则将该行存在结果集中;
  • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到该表的最后一行;
  • 执行器将上述遍历过程中所有满足条件的行组成记录集作为结果集返回给客户端,并写入查询缓存。

    存储引擎在找到一行合适的数据后,先返回给server层处理,server层处理完再读下一个。
    对于使用索引的表,第一次调用“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”接口。

数据库慢查询日志rows_examined字段,表示语句执行过程中扫描了多少行。执行器每次调用引擎获取数据行的时候累加。(同步调用)
执行器调用一次,在引擎内部可能扫描多行,引擎扫描行数跟rows_examined并不完全相同。

存储引擎层

插件式的架构模式,负责数据的存储和提取。
不同的存储引擎共用一个Server层(从连接器到执行器部分)。

InnoDB

MySQL5.5.5以上默认存储引擎。
buffer_pool

MyISAM

Memory