如果说数据库是存储数据的超市
SQL就是超市的售货员
MYSQL就是超市的经理
今天小高与各位猿友们分享MYSQL的基础架构
文章分为4部分,阅读全文约需要7分钟
废话不多说,直接上文章
▽
01
架构介绍
mysql整体结构由三部分组成,分别是客户端、server层和存储引擎层。
客户端:
就是我们平时连接mysql所用到的工具,比如jdbc、mysql-client、可视化连接工具等。
server层包括:
连接器:管理连接,进行权限验证。
查询缓存:检查客户端发送的查询指令是否存在缓存中,命中则直接返回结果。
分析器:词法分析、语法分析。
优化器:执行计划生成,索引选择。
执行器:操作引擎,返回结果。
存储引擎层:
它的职责是负责接收server层的指令执行获取或者更新磁盘的数据,在mysql中存储引擎包括InnoDB、MyISAM、Memory等。
下面还有3点,继续看?
02
server层各组件介绍
①连接器:
它在收到客户端的连接请求后,校验客户端的用户名和密码是否有效,校验失败则会提示客户端"Access denied for user"这样一个错误。查询权限表中用户所拥有的权限,后续执行表查询和操作的时候都是基于此时查询的权限,如果链接不会重新连接,即使管理员更改了用户的权限,用户也是享有此时查询的权限,除非用户断开连接重新发起连接,权限才会刷新。
此外连接器还负责管理连接的存活状态,如果客户端长时间没有动静,连接器会切断这个链接,mysql默认会话失效时间为8小时,可以设置wait_timeout来自定义这个值。如果连接被切断后,客户端再次执行sql操作请求,则会收到"Lost connection to MySQL server during query。",此时如果要继续执行,需要重新发起连接。
可以使用show processlist查看现在的连接。
连接可以分为两类:长连接和短连接;短连接每次操作都会断开,不建议使用,长连接也有弊端,如果长时间不关闭,则连接中的缓存会一直增大,所以使用长连接的同时要周期性断开。
②查询缓存:
当用户执行select查询时,server首选查询缓存中是否存在该sql对应的数据,如果存在则直接返回,否则继续后面执行阶段。
在查询缓存执行前会先判断该连接是否有查询该表的权限,如果具备查询权限才会返回结果。
在实际生产中不建议使用该功能,因为缓存失效频繁,若缓存中某条记录给更新则会清空整个缓存,这就导致对于更新压力比较大的数据库来说,查询缓存命中率非常低。这里可以配置query_cache_type参数来操作查询缓存功能,0(OFF)-代表关闭,1(ON)-代表开启,若select语句没有使用SQL_NO_CACHE则所有查询都执行缓存查询,2(DEMAND)-代表执行sql走缓存,只有通过SQL_CACHE指定的sql查询语句才会执行查询缓存。
在mysql8.0版本直接将该功能模块给删除了,mysql8.0以后的版本就不能使用这个功能了。
③分析器:
连接器将一串sql字符串交给分析器后,分析器中的词法分析器根据抽象语法树把这些由关键字、变量和空格组成的sql字符串解析出来。
解析完成后,进行语法分析,校验语法是否合规,若语法有误则会提示"You have an error in your SQL syntax",比如 from 关键字写成rom,少写了一个f。
此外在分析器执行阶段还会进行表元数据的校验,例如,查询的表是否存在,表中的列是否存在。
④优化器:
经过分析后,mysql将你想要执行的sql语句通过优化器进行优化,使得查询效率更高效,
比如在组合索引中有最左原则,如果我们没有按照最左原则拼写sql语句,这样可能导致执行不走索引,这时优化器可以优化成走索引的查询。
优化器有两种优化方式:
1)、RBO:基于规则的优化;
2)、CBO:基于成本的优化。
⑤执行器:
上述所有的步骤完成后,就该执行器登场了,执行器首先会校验当前用户是否有操作该表的权限,若具备相应权限,执行器会调用存储引擎相关接口获取数据进行数据操作,最终返回给客户端目标数据集。
server层除了以上所述的五大组件以外还有管理服务和工具组件、连接池组件和内置函数(如日期、时间、数学和加密函数等)、存储过程、触发器、视图等功能。
下面还有2点,坚持啊?
03
各存储引擎的特性
InnoDB:
InnoDB存储引擎支持事务,其特点是行锁设计、支持外键,适用于在线事务(OLTP)处理的应用。
MyISAM:
MyISAM存储引擎不支持事务,表锁设计,支持全文索引,适用于OLAP数据库应用。
Memory:
Memory存储引擎将表中的数据放在内存中,如果数据库重启或宕机,表中的数据都会消失,他的底层
通过Hash表进行存储,而不是B+树。
下面还有1点,不远了?
04
InnoDB与MyISAM存储引擎对比
①事务支持:
InnoDB支持事务,MyISAM不支持事务
②全文索引支持:
MyISAM支持全文索引,InnoDB不支持全文索引
③锁的粒度:
InnoDB是行锁,MyISAM是表锁
④数据存放规则:
InnoDB:
索引和数据都存在一个文件中,所有的数据都按照主键来组织排列。
数据表存放在.ibd文件中
表结构定义放在.frm文件中
MyISAM:
索引和数据分别存放在两个文件中。
数据存放在.MYD文件中
索引数据存放在.MYI文件中
表结构定义放在.frm文件中
⑤B+树叶节点存放内容的不同:
InnoDB在主键索引树的叶子节点存放的内容是整行数据。
MyISAM在主键索引树的叶子节点存放的数据为该条数据所在的物理空间的地址值。
⑥容灾:
InnoDB支持在线热备,有很成熟的在线热备份解决方案。
⑦查询性能:
MyISAM比InnoDB效率高,因为InnoDB在查询过程中先定位行所在的数据块,再从数据块中定位要查找的行,而MyISAM直接根据行所在的地址获取数据。
△
完结