SQL语句是如何在MySQL内部执行的

MySQL的内部组件,主要分为server层和引擎层。客户端和server进行连接以及发送sql,由server进行一系列的处理调用存储引擎获取数据。

server层:涵盖了绝大多数的MySQL的服务,包括内置函数、触发器、视图等功能都在这一层实现

  连接器:管理连接以及进行权限校验,比如navicat、jdbc等各种各样的客户端都要通过连接器和Server端建立连接

  缓存:客户端发过来一条sql,会先从缓存中取数据,大多数情况下不会太多使用缓存,对于一些不经常变化的,比如系统配置、菜单等可以考虑使用。在8.0中已经移出了缓存

  词法分析器:词法分析、语法分析

  优化器:生成执行计划和选择索引

  执行器:调用引擎接口和获取查询结果

引擎层主要包含了我们使用的存储引擎,比如innodb、myisam等,这一层的设计是插件式的,一个Mysql支持多个存储引擎,现在最常用的是innodb,如果创建表不指定默认就是innodb。

连接器:

[root@192 ~]# mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306
mysql> CREATE USER 'username'@'host' IDENTIFIED BY 'password'; // 创建新用户
mysql> grant all privileges on *.* to 'username'@'%'; // 赋与用户权限,%表示所有host
mysql> flush privileges // 刷新
mysql> update user set password=password(”test″) where user=’root’;// 设置用户名密码
mysql> show grants for root@"%"; // 查看当前用户的权限

查看连接:

 show processlist; 

Command为Sleep表示空闲连接,server长时间没有收到客户端的命令,就会把这个连接给断开,默认8小时set global wait_timeout命令设置

mysql> show global variables like "wait_timeout";
mysql> set global wait_timeout=3600; 

查询缓存:

  MySQL会在这个地方加一个k-v的缓存,k就是sql,v就是结果,如果能命中,就返回缓存的结果,但是一般情况下是比较鸡肋的,可能建好的缓存没用过,就被更新清除了,现在8.0之后已经移出的缓存。不过对于一些相对静态的信息还是有用的,比如系统菜单、系统配置等。缓存也是可以进行一些配置的。

my.cnf
#0:OFF,1:ON,2:DEMAND,当sql语句中有SQL_CACHE关键词时才缓存
query_cache_type=2

像上面这样配置,只有显示指定,才会使用缓存,如下:

mysql> select SQL_CACHE * from user where id = 1;

查看是否开启缓存:

mysql> show global variables like "%query_cache_type%";

查看缓存的信息:

mysql> show status like'%Qcache%';

通过这些指标可以有针对性对缓存进行调整。

分析器:

没有命中缓存,那就要开始准备sql语句执行了,分析器就是用来解析发送过来的sql,分析你到底想要什么。会先做词法分析,比如把字符串识别成字段名或者表名等等,组装之后在进行语法分析,看是不是符合MySQL的语法标准。

优化器:

执行之前,要对sql语句进行优化,比如要使用什么索引,要以什么顺序关联表等等,优化器会选择它认为效率更高的方式。

执行器:

执行器调用存储引擎的接口查询数据,返回执行结果。

MySQL的内部核心组件大体功能如上所示,对于我们开发人员,如果不是DBA,更多的精力要放在业务实现和sql优化上。

原文地址:https://www.cnblogs.com/dlcode/p/14242233.html