MySQL 基础结构:一条SQL查询语句是如何执行
2020-01-16 本文已影响0人
一生逍遥一生
MySQL可以分为Server层和存储引擎层两部分。
Server层包含连接器(管理链接,权限验证)、查询缓存(命中则直接返回结果)、分析器(词法分析,语法分析)、
优化器(执行计划生成,索引选择)、执行器等(执行引擎,返回结果)。
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。
从MySQL 5.5.5版本之后,InnoDB成为默认引擎。
SQL的执行顺序: 通过mysql连接到服务器-->执行select(查询缓存),如果命中,直接返回,如果没有命中,往下执行-->分析器-->优化器-->执行器。
连接器
MySQL客户端连接到服务端,如果长时间没有指令,连接器就会自动将它断开。wait_timeout 默认值为9小时。
建立长连接,长时间不断,会导致OOM,如何解决:
- 定期断开长链接。
- 如果使用MySQL 5.7或更新版本,在执行一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。
查询缓存
MySQL拿到一个查询请求后,会先到查询缓存,之前是不是执行过这条语句。如果直接在命中,直接返回;如果不在查询缓存中,就会继续后面执行阶段。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
MySQL提供了"按需使用"的方式。将参数query_cache_type设置为DEMAND,对于默认SQL的语句都不使用查询缓存。
MySQL 8.0版本直接将查询缓存的整块功能删除。
分析器
对语句进行词法分析和语法分析。
优化器
优化器是在表里面有多个索引的时候,决定使用那个索引;或者在一个语句有多表关联的时候,决定各个表的连接顺序。
执行器
执行器的流程:
- 调用InnoDB引擎接口取这个表的第一行,进行判断,如果符合条件,存储在结果集中,如果不符合条件,跳过;
- 调用引擎接口取下一个,重复相同的判断逻辑,直到取到这个表的最后一行。
- 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
查询慢查询日志,rows_examined表示扫描了多少行.