MySql的基础架构分成两大部分(如图):
Server层 : 连接器 、查询缓存、解析器、优化器、执行器
数据引擎层: InnoDB 、 MyISAM 、...... 等
连接器
- 基础连接处理(建立连接验证、用户的权限)
- 管理缓冲用户连接,线程处理等需要缓存的需求,为通过认证安全接入的客户端提供线程。
注:已建立连接如果权限发生改变,没重新连接授权,客户端的连接权限依然是没改变的
查询缓存
- 对 select 开头语义的查询结果进行缓存(K --> 查询语句 ,V --> 结果集)
- MySql默认不开启缓存,一般非业务的静态表不建议开启查询缓存。频繁的新增、修改、删除等操作会导致缓存失效,再创建导致额外的性能开销。
- Mysql也提供了这种“按需使用”的方式。你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样:
mysql> select SQL_CACHE * from T where id =100;
Mysql8.0版本已经移除查询缓存功能。
分析器
- 主要分析SQL的语义:select 、update 、 inster 、delete ,from,on,join,where ... 生成新解析树,传递到优化器进行优化策略选择 ;
- 语义检查: 分析过程如果语法不符合语义的标准则会返回异常提示。
优化器
- 将前面分析器的解析树转换成执行计划,并进行评估最优。
- 表有多个索引,存在 join 关联 where 条件执行的顺序 如例:
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
是先从t1表取出t1.c = 10 在关联 t2表后判断 t2.d =20 还是反过来的逻辑
执行器
- 执行器在接收优化器评估的最优的语句 开始执行的时候,先判断这个表 T 有没有查询的权限
(在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限)。 - 有权限情况下才会打开表,执行器根据表的引擎定义去使用引擎接口(如:InnoDB 为例)
查询表 name = liu,没有索引的情况下,调用引擎重复取下一行进行判断,直到最后一行。