mysql内部是如何实现的_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;

38176dd48e4369c6f96f2d54ccf9cce6.png

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%';

bb3702523b36833002e0e5ac9f73555c.png

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

分析器:

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

优化器:

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

执行器:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值