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优化上。